Skip to content

Commit

Permalink
perf(es/lexer): Add fast-path to jsx lexer (#9081)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Jun 19, 2024
1 parent 1839980 commit af58606
Showing 1 changed file with 39 additions and 15 deletions.
54 changes: 39 additions & 15 deletions crates/swc_ecma_parser/src/lexer/jsx.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use either::Either;
use smartstring::{LazyCompact, SmartString};

use super::*;

Expand Down Expand Up @@ -40,14 +41,23 @@ impl<'a> Lexer<'a> {
}
return self.read_token();
}
out.push_str(unsafe {
// Safety: We already checked for the range
self.input.slice(chunk_start, cur_pos)
});

return Ok(Some(Token::JSXText {
raw: self.atoms.atom(out),
}));
let raw = if out.is_empty() {
// Fast path: We don't need to allocate
let s = unsafe {
// Safety: We already checked for the range
self.input.slice(chunk_start, cur_pos)
};
self.atoms.atom(s)
} else {
out.push_str(unsafe {
// Safety: We already checked for the range
self.input.slice(chunk_start, cur_pos)
});
self.atoms.atom(out)
};

return Ok(Some(Token::JSXText { raw }));
}
'>' => {
self.emit_error(
Expand Down Expand Up @@ -128,7 +138,7 @@ impl<'a> Lexer<'a> {
s.chars().all(|c| c.is_ascii_digit())
}

let mut s = String::new();
let mut s = SmartString::<LazyCompact>::default();

let c = self.input.cur();
debug_assert_eq!(c, Some('&'));
Expand Down Expand Up @@ -292,13 +302,27 @@ impl<'a> Lexer<'a> {
}
}

let cur_pos = self.input.cur_pos();
let value = unsafe {
// Safety: We already checked for the range
self.input.slice(chunk_start, cur_pos)
};
let value = if out.is_empty() {
// Fast path: We don't need to allocate

let cur_pos = self.input.cur_pos();
let value = unsafe {
// Safety: We already checked for the range
self.input.slice(chunk_start, cur_pos)
};

out.push_str(value);
self.atoms.atom(value)
} else {
let cur_pos = self.input.cur_pos();
let value = unsafe {
// Safety: We already checked for the range
self.input.slice(chunk_start, cur_pos)
};

out.push_str(value);

self.atoms.atom(out)
};

// it might be at the end of the file when
// the string literal is unterminated
Expand All @@ -316,7 +340,7 @@ impl<'a> Lexer<'a> {
};

Ok(Token::Str {
value: self.atoms.atom(out),
value,
raw: self.atoms.atom(raw),
})
}
Expand Down

1 comment on commit af58606

@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: af58606 Previous: 238f1c5 Ratio
es/full/bugs-1 291609 ns/iter (± 7556) 298985 ns/iter (± 5320) 0.98
es/full/minify/libraries/antd 1981305935 ns/iter (± 40617167) 1808422595 ns/iter (± 43874955) 1.10
es/full/minify/libraries/d3 356011647 ns/iter (± 3113121) 346699704 ns/iter (± 2875096) 1.03
es/full/minify/libraries/echarts 1677882018 ns/iter (± 31650687) 1514509639 ns/iter (± 26996919) 1.11
es/full/minify/libraries/jquery 104449686 ns/iter (± 512634) 102755901 ns/iter (± 509861) 1.02
es/full/minify/libraries/lodash 115885436 ns/iter (± 367790) 114181866 ns/iter (± 528136) 1.01
es/full/minify/libraries/moment 60281929 ns/iter (± 173725) 59387176 ns/iter (± 178357) 1.02
es/full/minify/libraries/react 18500931 ns/iter (± 51280) 18290762 ns/iter (± 86415) 1.01
es/full/minify/libraries/terser 290831341 ns/iter (± 4707340) 277185716 ns/iter (± 6225685) 1.05
es/full/minify/libraries/three 529904721 ns/iter (± 10445698) 480570409 ns/iter (± 10794108) 1.10
es/full/minify/libraries/typescript 3290623400 ns/iter (± 27802452) 3245929736 ns/iter (± 33467231) 1.01
es/full/minify/libraries/victory 755853037 ns/iter (± 18990956) 767594647 ns/iter (± 15816784) 0.98
es/full/minify/libraries/vue 146011921 ns/iter (± 972917) 146755152 ns/iter (± 1534714) 0.99
es/full/codegen/es3 60025 ns/iter (± 672) 59154 ns/iter (± 388) 1.01
es/full/codegen/es5 60247 ns/iter (± 459) 58860 ns/iter (± 181) 1.02
es/full/codegen/es2015 60111 ns/iter (± 227) 58614 ns/iter (± 188) 1.03
es/full/codegen/es2016 59906 ns/iter (± 143) 58721 ns/iter (± 179) 1.02
es/full/codegen/es2017 59909 ns/iter (± 272) 58852 ns/iter (± 322) 1.02
es/full/codegen/es2018 59915 ns/iter (± 164) 58666 ns/iter (± 160) 1.02
es/full/codegen/es2019 59885 ns/iter (± 182) 58665 ns/iter (± 206) 1.02
es/full/codegen/es2020 59925 ns/iter (± 177) 58867 ns/iter (± 376) 1.02
es/full/all/es3 161053851 ns/iter (± 890789) 160535825 ns/iter (± 907105) 1.00
es/full/all/es5 155745522 ns/iter (± 1345519) 154686881 ns/iter (± 1438573) 1.01
es/full/all/es2015 115247679 ns/iter (± 563436) 115525617 ns/iter (± 568246) 1.00
es/full/all/es2016 114654564 ns/iter (± 526111) 113857841 ns/iter (± 820293) 1.01
es/full/all/es2017 114065912 ns/iter (± 568193) 113685394 ns/iter (± 876687) 1.00
es/full/all/es2018 111968622 ns/iter (± 1047599) 112116777 ns/iter (± 627956) 1.00
es/full/all/es2019 110919931 ns/iter (± 845132) 111164273 ns/iter (± 542461) 1.00
es/full/all/es2020 107386517 ns/iter (± 701101) 107209335 ns/iter (± 634197) 1.00
es/full/parser 456219 ns/iter (± 2019) 460589 ns/iter (± 12538) 0.99
es/full/base/fixer 15539 ns/iter (± 71) 15602 ns/iter (± 568) 1.00
es/full/base/resolver_and_hygiene 81435 ns/iter (± 290) 80288 ns/iter (± 202) 1.01
serialization of serde 265 ns/iter (± 7) 266 ns/iter (± 0) 1.00
css/minify/libraries/bootstrap 21925275 ns/iter (± 107971) 21954322 ns/iter (± 22713) 1.00
css/visitor/compare/clone 1399968 ns/iter (± 26727) 1402313 ns/iter (± 25417) 1.00
css/visitor/compare/visit_mut_span 1521433 ns/iter (± 19342) 1522948 ns/iter (± 17507) 1.00
css/visitor/compare/visit_mut_span_panic 1546270 ns/iter (± 5880) 1543067 ns/iter (± 6651) 1.00
css/visitor/compare/fold_span 2039403 ns/iter (± 6578) 2035171 ns/iter (± 4673) 1.00
css/visitor/compare/fold_span_panic 2156781 ns/iter (± 2996) 2155893 ns/iter (± 6795) 1.00
css/lexer/bootstrap_5_1_3 3460072 ns/iter (± 3762) 3468154 ns/iter (± 3079) 1.00
css/lexer/foundation_6_7_4 2790045 ns/iter (± 1369) 2797190 ns/iter (± 2697) 1.00
css/lexer/tailwind_3_1_1 532470 ns/iter (± 382) 532353 ns/iter (± 438) 1.00
css/parser/bootstrap_5_1_3 16039266 ns/iter (± 34334) 16077132 ns/iter (± 97141) 1.00
css/parser/foundation_6_7_4 12802782 ns/iter (± 29154) 12862872 ns/iter (± 6996) 1.00
css/parser/tailwind_3_1_1 2581524 ns/iter (± 21061) 2598600 ns/iter (± 5436) 0.99
es/codegen/colors 729143 ns/iter (± 399514) 723416 ns/iter (± 395074) 1.01
es/codegen/large 3010325 ns/iter (± 1594347) 3009030 ns/iter (± 1580904) 1.00
es/codegen/with-parser/colors 41327 ns/iter (± 411) 41336 ns/iter (± 328) 1.00
es/codegen/with-parser/large 451933 ns/iter (± 1380) 452105 ns/iter (± 2514) 1.00
es/minify/libraries/antd 1487637633 ns/iter (± 52095785) 1488841400 ns/iter (± 42663453) 1.00
es/minify/libraries/d3 291732894 ns/iter (± 12748846) 286388751 ns/iter (± 13269912) 1.02
es/minify/libraries/echarts 1263005879 ns/iter (± 27130092) 1230163006 ns/iter (± 44031395) 1.03
es/minify/libraries/jquery 83159447 ns/iter (± 390115) 82180169 ns/iter (± 244664) 1.01
es/minify/libraries/lodash 105183839 ns/iter (± 407475) 104282621 ns/iter (± 499186) 1.01
es/minify/libraries/moment 49244171 ns/iter (± 254735) 48046386 ns/iter (± 69162) 1.02
es/minify/libraries/react 16309590 ns/iter (± 20160) 16176741 ns/iter (± 49775) 1.01
es/minify/libraries/terser 223425094 ns/iter (± 4251353) 217600314 ns/iter (± 6639948) 1.03
es/minify/libraries/three 381946358 ns/iter (± 24638450) 402859037 ns/iter (± 7000081) 0.95
es/minify/libraries/typescript 2878746073 ns/iter (± 38418796) 2765086514 ns/iter (± 20700614) 1.04
es/minify/libraries/victory 674221067 ns/iter (± 21423722) 666407649 ns/iter (± 34415598) 1.01
es/minify/libraries/vue 123759111 ns/iter (± 1193326) 121463971 ns/iter (± 1053447) 1.02
es/visitor/compare/clone 1703248 ns/iter (± 9691) 1695845 ns/iter (± 4921) 1.00
es/visitor/compare/visit_mut_span 2041088 ns/iter (± 2389) 2034621 ns/iter (± 8842) 1.00
es/visitor/compare/visit_mut_span_panic 2030526 ns/iter (± 3568) 2029761 ns/iter (± 28467) 1.00
es/visitor/compare/fold_span 2763279 ns/iter (± 12823) 2721509 ns/iter (± 15621) 1.02
es/visitor/compare/fold_span_panic 2797136 ns/iter (± 4715) 2759792 ns/iter (± 8911) 1.01
es/lexer/colors 9505 ns/iter (± 195) 9241 ns/iter (± 88) 1.03
es/lexer/angular 4885195 ns/iter (± 10833) 4777904 ns/iter (± 29978) 1.02
es/lexer/backbone 613559 ns/iter (± 1281) 623864 ns/iter (± 2128) 0.98
es/lexer/jquery 3454508 ns/iter (± 6562) 3479065 ns/iter (± 23955) 0.99
es/lexer/jquery mobile 5151583 ns/iter (± 69334) 5174955 ns/iter (± 23269) 1.00
es/lexer/mootools 2749379 ns/iter (± 4337) 2738883 ns/iter (± 14198) 1.00
es/lexer/underscore 515648 ns/iter (± 3626) 519330 ns/iter (± 1276) 0.99
es/lexer/three 15543270 ns/iter (± 176141) 15519923 ns/iter (± 55207) 1.00
es/lexer/yui 2818113 ns/iter (± 50925) 2860513 ns/iter (± 29469) 0.99
es/lexer/cal-com 12503664 ns/iter (± 100469) 12538765 ns/iter (± 41313) 1.00
es/lexer/typescript 88366758 ns/iter (± 649840) 87492115 ns/iter (± 351823) 1.01
es/parser/colors 24207 ns/iter (± 452) 23913 ns/iter (± 109) 1.01
es/parser/angular 12381757 ns/iter (± 72513) 12440877 ns/iter (± 85379) 1.00
es/parser/backbone 1819446 ns/iter (± 6501) 1798124 ns/iter (± 7552) 1.01
es/parser/jquery 10048030 ns/iter (± 54616) 9921538 ns/iter (± 67001) 1.01
es/parser/jquery mobile 15139985 ns/iter (± 139348) 14956843 ns/iter (± 96517) 1.01
es/parser/mootools 7819964 ns/iter (± 21581) 7703949 ns/iter (± 55902) 1.02
es/parser/underscore 1589380 ns/iter (± 5919) 1565627 ns/iter (± 6208) 1.02
es/parser/three 44053345 ns/iter (± 496953) 43720351 ns/iter (± 497499) 1.01
es/parser/yui 7379593 ns/iter (± 65897) 7365400 ns/iter (± 39731) 1.00
es/parser/cal-com 41075176 ns/iter (± 192337) 42441813 ns/iter (± 472703) 0.97
es/parser/typescript 269689513 ns/iter (± 3842553) 264785378 ns/iter (± 785945) 1.02
es/preset-env/usage/builtin_type 136743 ns/iter (± 36808) 135972 ns/iter (± 33909) 1.01
es/preset-env/usage/property 16394 ns/iter (± 71) 16427 ns/iter (± 147) 1.00
es/resolver/typescript 100744702 ns/iter (± 3544517) 103886193 ns/iter (± 2033631) 0.97
es/fixer/typescript 79989774 ns/iter (± 5029994) 81255809 ns/iter (± 2203838) 0.98
es/hygiene/typescript 183694156 ns/iter (± 4149396) 188950922 ns/iter (± 2189172) 0.97
es/resolver_with_hygiene/typescript 302324124 ns/iter (± 2702970) 308658017 ns/iter (± 2242011) 0.98
es/visitor/base-perf/module_clone 56881 ns/iter (± 684) 57882 ns/iter (± 781) 0.98
es/visitor/base-perf/fold_empty 60547 ns/iter (± 532) 60051 ns/iter (± 880) 1.01
es/visitor/base-perf/fold_noop_impl_all 60555 ns/iter (± 763) 60374 ns/iter (± 206) 1.00
es/visitor/base-perf/fold_noop_impl_vec 60426 ns/iter (± 503) 60851 ns/iter (± 383) 0.99
es/visitor/base-perf/boxing_boxed_clone 60 ns/iter (± 0) 60 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 46 ns/iter (± 0) 46 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 106 ns/iter (± 0) 106 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed 81 ns/iter (± 0) 81 ns/iter (± 0) 1
es/visitor/base-perf/visit_contains_this 2485 ns/iter (± 12) 2482 ns/iter (± 8) 1.00
es/base/parallel/resolver/typescript 2510540884 ns/iter (± 143062092) 2512810991 ns/iter (± 133198971) 1.00
es/base/parallel/hygiene/typescript 3115820887 ns/iter (± 54222894) 3272860671 ns/iter (± 57878659) 0.95
babelify-only 477908 ns/iter (± 3854) 477833 ns/iter (± 3723) 1.00
parse_and_babelify_angular 40895258 ns/iter (± 820205) 41060600 ns/iter (± 2062419) 1.00
parse_and_babelify_backbone 4305135 ns/iter (± 145226) 4426043 ns/iter (± 127265) 0.97
parse_and_babelify_jquery 28151313 ns/iter (± 304406) 28342652 ns/iter (± 254300) 0.99
parse_and_babelify_jquery_mobile 47994025 ns/iter (± 630083) 48690745 ns/iter (± 577105) 0.99
parse_and_babelify_mootools 25432920 ns/iter (± 459544) 25478708 ns/iter (± 1672446) 1.00
parse_and_babelify_underscore 3590739 ns/iter (± 25717) 3601076 ns/iter (± 20758) 1.00
parse_and_babelify_yui 23725714 ns/iter (± 447193) 27665419 ns/iter (± 2077720) 0.86
html/minify/document/css_spec 45558340 ns/iter (± 452430) 47007161 ns/iter (± 245664) 0.97
html/minify/document/github 18424840 ns/iter (± 194984) 18446566 ns/iter (± 244942) 1.00
html/minify/document/stackoverflow 16875231 ns/iter (± 400132) 17609647 ns/iter (± 793089) 0.96
html/minify/document_fragment/css_spec 44836405 ns/iter (± 91525) 46571856 ns/iter (± 486683) 0.96
html/minify/document_fragment/github 18267316 ns/iter (± 33222) 18534172 ns/iter (± 173064) 0.99
html/minify/document_fragment/stackoverflow 16641264 ns/iter (± 30692) 16981590 ns/iter (± 290978) 0.98
html/document/visitor/compare/clone 165820 ns/iter (± 1745) 166929 ns/iter (± 1336) 0.99
html/document/visitor/compare/visit_mut_span 183293 ns/iter (± 1096) 184117 ns/iter (± 1437) 1.00
html/document/visitor/compare/visit_mut_span_panic 191593 ns/iter (± 4882) 188669 ns/iter (± 2802) 1.02
html/document/visitor/compare/fold_span 232630 ns/iter (± 1319) 233118 ns/iter (± 2398) 1.00
html/document/visitor/compare/fold_span_panic 281758 ns/iter (± 1902) 280933 ns/iter (± 1034) 1.00
html/document_fragment/visitor/compare/clone 168122 ns/iter (± 783) 168007 ns/iter (± 535) 1.00
html/document_fragment/visitor/compare/visit_mut_span 184196 ns/iter (± 1630) 184072 ns/iter (± 1804) 1.00
html/document_fragment/visitor/compare/visit_mut_span_panic 188424 ns/iter (± 1703) 188160 ns/iter (± 3580) 1.00
html/document_fragment/visitor/compare/fold_span 230750 ns/iter (± 1442) 228205 ns/iter (± 1874) 1.01
html/document_fragment/visitor/compare/fold_span_panic 284070 ns/iter (± 1656) 280155 ns/iter (± 1009) 1.01
html/lexer/css_2021_spec 12873925 ns/iter (± 188948) 12990434 ns/iter (± 49990) 0.99
html/lexer/github_com_17_05_2022 4915711 ns/iter (± 15502) 4957775 ns/iter (± 10231) 0.99
html/lexer/stackoverflow_com_17_05_2022 4649654 ns/iter (± 3167) 4709916 ns/iter (± 16871) 0.99
html/parser/parser_document/css_2021_spec 26319142 ns/iter (± 629708) 25264856 ns/iter (± 141878) 1.04
html/parser/parser_document/github_com_17_05_2022 8515829 ns/iter (± 37453) 8439937 ns/iter (± 33535) 1.01
html/parser/parser_document/stackoverflow_com_17_05_2022 7484427 ns/iter (± 18053) 7382028 ns/iter (± 8249) 1.01
html/parser/parser_document_fragment/css_2021_spec 25519590 ns/iter (± 156570) 25091556 ns/iter (± 133286) 1.02
html/parser/parser_document_fragment/github_com_17_05_2022 8473128 ns/iter (± 26690) 8455505 ns/iter (± 73908) 1.00
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7393373 ns/iter (± 13551) 7283319 ns/iter (± 20625) 1.02

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.