diff --git a/html5ever/benches/html5ever.rs b/html5ever/benches/html5ever.rs
index c8114fb6..f74b13a7 100644
--- a/html5ever/benches/html5ever.rs
+++ b/html5ever/benches/html5ever.rs
@@ -5,10 +5,10 @@ extern crate html5ever;
use std::fs;
use std::path::PathBuf;
-use criterion::Criterion;
+use criterion::{BatchSize, Criterion};
-use html5ever::tendril::*;
use html5ever::tokenizer::{BufferQueue, Token, TokenSink, TokenSinkResult, Tokenizer};
+use html5ever::{tendril::*, TokenizerResult};
struct Sink;
@@ -51,19 +51,25 @@ fn run_bench(c: &mut Criterion, name: &str) {
let test_name = format!("html tokenizing {name}");
+ // Construct a buffer queue to feed to the tokenizer
+ let buffer_queue = BufferQueue::default();
+ for buf in input.into_iter() {
+ buffer_queue.push_back(buf);
+ }
+
c.bench_function(&test_name, move |b| {
- b.iter(|| {
- let tok = Tokenizer::new(Sink, Default::default());
- let buffer = BufferQueue::default();
- // We are doing clone inside the bench function, this is not ideal, but possibly
- // necessary since our iterator consumes the underlying buffer.
- for buf in input.clone().into_iter() {
- buffer.push_back(buf);
- let _ = tok.feed(&buffer);
- }
- let _ = tok.feed(&buffer);
- tok.end();
- })
+ b.iter_batched(
+ || buffer_queue.clone(),
+ |buffer_queue| {
+ let tok = Tokenizer::new(Sink, Default::default());
+
+ // Tokenize the entire input, ignoring any