-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf(css/parser): Improve performance of lexer (#4921)
- Loading branch information
1 parent
e25b6ed
commit 327969d
Showing
11 changed files
with
19,296 additions
and
448 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
extern crate swc_node_base; | ||
|
||
use criterion::{black_box, criterion_group, criterion_main, Bencher, Criterion}; | ||
use swc_common::{input::StringInput, FileName, Span, SyntaxContext, DUMMY_SP}; | ||
use swc_css_ast::Stylesheet; | ||
use swc_css_parser::{lexer::Lexer, parser::Parser}; | ||
use swc_css_visit::{Fold, FoldWith, VisitMut, VisitMutWith}; | ||
|
||
static SOURCE: &str = include_str!("files/bootstrap_5_1_3.css"); | ||
|
||
fn run<F>(b: &mut Bencher, mut op: F) | ||
where | ||
F: FnMut(Stylesheet) -> Stylesheet, | ||
{ | ||
let _ = ::testing::run_test(false, |cm, _| { | ||
let fm = cm.new_source_file(FileName::Anon, SOURCE.into()); | ||
|
||
let lexer = Lexer::new(StringInput::from(&*fm), Default::default()); | ||
let mut parser = Parser::new(lexer, Default::default()); | ||
let stylesheet: Stylesheet = parser.parse_all().unwrap(); | ||
|
||
b.iter(|| { | ||
let stylesheet = stylesheet.clone(); | ||
let stylesheet = op(stylesheet); | ||
|
||
black_box(stylesheet) | ||
}); | ||
|
||
Ok(()) | ||
}); | ||
} | ||
|
||
fn bench_cases(c: &mut Criterion) { | ||
c.bench_function("css/visitor/compare/clone", |b| run(b, |m: Stylesheet| m)); | ||
|
||
c.bench_function("css/visitor/compare/visit_mut_span", |b| { | ||
struct RespanVisitMut; | ||
|
||
impl VisitMut for RespanVisitMut { | ||
fn visit_mut_span(&mut self, span: &mut Span) { | ||
*span = DUMMY_SP; | ||
} | ||
} | ||
|
||
run(b, |mut m| { | ||
m.visit_mut_with(&mut RespanVisitMut); | ||
|
||
m | ||
}); | ||
}); | ||
|
||
c.bench_function("css/visitor/compare/visit_mut_span_panic", |b| { | ||
struct RespanVisitMut; | ||
|
||
impl VisitMut for RespanVisitMut { | ||
fn visit_mut_span(&mut self, span: &mut Span) { | ||
if span.ctxt != SyntaxContext::empty() { | ||
panic!() | ||
} | ||
|
||
*span = DUMMY_SP; | ||
} | ||
} | ||
|
||
run(b, |mut m| { | ||
m.visit_mut_with(&mut RespanVisitMut); | ||
|
||
m | ||
}); | ||
}); | ||
|
||
c.bench_function("css/visitor/compare/fold_span", |b| { | ||
struct RespanFold; | ||
|
||
impl Fold for RespanFold { | ||
fn fold_span(&mut self, _: Span) -> Span { | ||
DUMMY_SP | ||
} | ||
} | ||
|
||
run(b, |m| m.fold_with(&mut RespanFold)); | ||
}); | ||
|
||
c.bench_function("css/visitor/compare/fold_span_panic", |b| { | ||
struct RespanFold; | ||
|
||
impl Fold for RespanFold { | ||
fn fold_span(&mut self, s: Span) -> Span { | ||
if s.ctxt != SyntaxContext::empty() { | ||
panic!() | ||
} | ||
|
||
DUMMY_SP | ||
} | ||
} | ||
|
||
run(b, |m| m.fold_with(&mut RespanFold)); | ||
}); | ||
} | ||
|
||
criterion_group!(benches, bench_cases); | ||
criterion_main!(benches); |
Oops, something went wrong.
327969d
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Benchmark
es/full/minify/libraries/antd
1687852032
ns/iter (± 115492537
)2088937504
ns/iter (± 25493866
)0.81
es/full/minify/libraries/d3
383362794
ns/iter (± 19881074
)501349620
ns/iter (± 14643252
)0.76
es/full/minify/libraries/echarts
2132723535
ns/iter (± 28666602
)2385130544
ns/iter (± 13595922
)0.89
es/full/minify/libraries/jquery
84993060
ns/iter (± 2725512
)106355649
ns/iter (± 1874642
)0.80
es/full/minify/libraries/lodash
111613261
ns/iter (± 840693
)147155255
ns/iter (± 3006811
)0.76
es/full/minify/libraries/moment
48398614
ns/iter (± 1416260
)60939036
ns/iter (± 801255
)0.79
es/full/minify/libraries/react
17328414
ns/iter (± 1006880
)20686285
ns/iter (± 265025
)0.84
es/full/minify/libraries/terser
455712465
ns/iter (± 4588344
)724903221
ns/iter (± 13016136
)0.63
es/full/minify/libraries/three
492279857
ns/iter (± 35468730
)650243732
ns/iter (± 22170563
)0.76
es/full/minify/libraries/typescript
4096688891
ns/iter (± 107188691
)4705155372
ns/iter (± 30012472
)0.87
es/full/minify/libraries/victory
710844105
ns/iter (± 25177362
)881135579
ns/iter (± 25680561
)0.81
es/full/minify/libraries/vue
134878412
ns/iter (± 5240926
)155610210
ns/iter (± 2980267
)0.87
es/full/codegen/es3
29943
ns/iter (± 647
)39408
ns/iter (± 1895
)0.76
es/full/codegen/es5
29441
ns/iter (± 752
)40087
ns/iter (± 1875
)0.73
es/full/codegen/es2015
34137
ns/iter (± 207
)39110
ns/iter (± 2127
)0.87
es/full/codegen/es2016
29417
ns/iter (± 545
)40087
ns/iter (± 1482
)0.73
es/full/codegen/es2017
29819
ns/iter (± 510
)38779
ns/iter (± 1285
)0.77
es/full/codegen/es2018
29405
ns/iter (± 556
)39062
ns/iter (± 1467
)0.75
es/full/codegen/es2019
29678
ns/iter (± 546
)38877
ns/iter (± 1455
)0.76
es/full/codegen/es2020
29572
ns/iter (± 506
)39150
ns/iter (± 1435
)0.76
es/full/all/es3
185641042
ns/iter (± 9416300
)221846853
ns/iter (± 4698648
)0.84
es/full/all/es5
180212746
ns/iter (± 8059646
)209958431
ns/iter (± 5263834
)0.86
es/full/all/es2015
121290734
ns/iter (± 9407250
)167770577
ns/iter (± 5356696
)0.72
es/full/all/es2016
142607177
ns/iter (± 11405578
)167741441
ns/iter (± 3765854
)0.85
es/full/all/es2017
118892357
ns/iter (± 2613361
)164538109
ns/iter (± 3268757
)0.72
es/full/all/es2018
120090331
ns/iter (± 12350045
)164778601
ns/iter (± 3541838
)0.73
es/full/all/es2019
139340836
ns/iter (± 12675519
)163598430
ns/iter (± 3419452
)0.85
es/full/all/es2020
109664843
ns/iter (± 2074302
)156781485
ns/iter (± 3508852
)0.70
es/full/parser
510760
ns/iter (± 48191
)754351
ns/iter (± 48885
)0.68
es/full/base/fixer
24419
ns/iter (± 388
)35682
ns/iter (± 1068
)0.68
es/full/base/resolver_and_hygiene
140059
ns/iter (± 1689
)179174
ns/iter (± 7039
)0.78
serialization of ast node
180
ns/iter (± 0
)200
ns/iter (± 9
)0.90
serialization of serde
181
ns/iter (± 0
)198
ns/iter (± 6
)0.91
This comment was automatically generated by workflow using github-action-benchmark.