Skip to content

Commit

Permalink
perf(css/parser): Improve performance of lexer (#4921)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Jun 11, 2022
1 parent e25b6ed commit 327969d
Show file tree
Hide file tree
Showing 11 changed files with 19,296 additions and 448 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions crates/swc_css_parser/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,21 @@ swc_common = { version = "0.18.0", path = "../swc_common" }
swc_css_ast = { version = "0.93.0", path = "../swc_css_ast" }

[dev-dependencies]
criterion = "0.3"
serde = "1.0.127"
serde_json = "1.0.66"
swc_css_visit = { version = "0.92.0", path = "../swc_css_visit" }
swc_node_base = { version = "0.5.0", path = "../swc_node_base" }
testing = { version = "0.20.0", path = "../testing" }

[[bench]]
harness = false
name = "compare"

[[bench]]
harness = false
name = "lexer"

[[bench]]
harness = false
name = "parser"
102 changes: 102 additions & 0 deletions crates/swc_css_parser/benches/compare.rs
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);

1 comment on commit 327969d

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 327969d Previous: f479951 Ratio
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.

Please sign in to comment.