oxc/tasks/benchmark/benches/lexer.rs
dalaoshu d18c896a2c
perf(rust): use cow_utils instead (#5664)
Related to #5586 and #5662

---------

Co-authored-by: Boshen <boshenc@gmail.com>
2024-09-11 18:39:30 +08:00

47 lines
1.8 KiB
Rust

#![allow(clippy::disallowed_methods)]
use oxc_allocator::Allocator;
use oxc_benchmark::{criterion_group, criterion_main, BenchmarkId, Criterion};
use oxc_parser::lexer::{Kind, Lexer};
use oxc_span::SourceType;
use oxc_tasks_common::{TestFile, TestFiles};
fn bench_lexer(criterion: &mut Criterion) {
let mut group = criterion.benchmark_group("lexer");
// Lexer lacks awareness of JS grammar, so it gets confused by a few things without the parser
// driving it, notably escapes in regexps and template strings.
// So simplify the input for it, by removing backslashes and converting template strings to
// normal string literals.
let files = TestFiles::complicated()
.files()
.iter()
.map(|file| TestFile {
url: file.url.clone(),
file_name: file.file_name.clone(),
source_text: file.source_text.replace('\\', " ").replace('`', "'"),
})
.collect::<Vec<_>>();
for file in files {
let source_type = SourceType::from_path(&file.file_name).unwrap();
group.bench_with_input(
BenchmarkId::from_parameter(&file.file_name),
&file.source_text,
|b, source_text| {
// Do not include initializing allocator in benchmark.
// User code would likely reuse the same allocator over and over to parse multiple files,
// so we do the same here.
let mut allocator = Allocator::default();
b.iter(|| {
let mut lexer = Lexer::new_for_benchmarks(&allocator, source_text, source_type);
while lexer.next_token().kind != Kind::Eof {}
allocator.reset();
});
},
);
}
group.finish();
}
criterion_group!(lexer, bench_lexer);
criterion_main!(lexer);