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