Skip to content

Commit 373bac5

Browse files
authoredJun 18, 2024··
perf(es/lexer): Make lexing of string literals faster (#9077)
**Description:** We don't need to push a character at a time. This profiling result does not include improvements from #9076. ``` Benchmarking es/lexer/cal-com es/lexer/cal-com time: [6.4555 ms 6.4936 ms 6.5368 ms] ```
1 parent c0d40c6 commit 373bac5

File tree

1 file changed

+83
-26
lines changed
  • crates/swc_ecma_parser/src/lexer

1 file changed

+83
-26
lines changed
 

‎crates/swc_ecma_parser/src/lexer/mod.rs

+83-26
Original file line numberDiff line numberDiff line change
@@ -969,24 +969,42 @@ impl<'a> Lexer<'a> {
969969
fn read_str_lit(&mut self) -> LexResult<Token> {
970970
debug_assert!(self.cur() == Some('\'') || self.cur() == Some('"'));
971971
let start = self.cur_pos();
972-
let quote = self.cur().unwrap();
972+
let quote = self.cur().unwrap() as u8;
973973

974974
self.bump(); // '"'
975975

976-
self.with_buf(|l, out| {
977-
while let Some(c) = {
978-
// Optimization
979-
{
980-
let s = l
981-
.input
982-
.uncons_while(|c| c != quote && c != '\\' && !c.is_line_break());
983-
out.push_str(s);
984-
}
985-
l.cur()
986-
} {
987-
match c {
988-
c if c == quote => {
989-
l.bump();
976+
let mut has_escape = false;
977+
let mut slice_start = self.input.cur_pos();
978+
979+
self.with_buf(|l, buf| {
980+
loop {
981+
if let Some(c) = l.input.cur_as_ascii() {
982+
if c == quote {
983+
let value_end = l.cur_pos();
984+
985+
let value = if !has_escape {
986+
let s = unsafe {
987+
// Safety: slice_start and value_end are valid position because we
988+
// got them from `self.input`
989+
l.input.slice(slice_start, value_end)
990+
};
991+
992+
l.atoms.atom(s)
993+
} else {
994+
let s = unsafe {
995+
// Safety: slice_start and value_end are valid position because we
996+
// got them from `self.input`
997+
l.input.slice(slice_start, value_end)
998+
};
999+
buf.push_str(s);
1000+
1001+
l.atoms.atom(&**buf)
1002+
};
1003+
1004+
unsafe {
1005+
// Safety: cur is quote
1006+
l.input.bump();
1007+
}
9901008

9911009
let end = l.cur_pos();
9921010

@@ -995,28 +1013,67 @@ impl<'a> Lexer<'a> {
9951013
// `self.input`
9961014
l.input.slice(start, end)
9971015
};
1016+
let raw = l.atoms.atom(raw);
9981017

999-
return Ok(Token::Str {
1000-
value: l.atoms.atom(&*out),
1001-
raw: l.atoms.atom(raw),
1002-
});
1018+
return Ok(Token::Str { value, raw });
10031019
}
1004-
'\\' => {
1020+
1021+
if c == b'\\' {
1022+
has_escape = true;
1023+
1024+
{
1025+
let end = l.cur_pos();
1026+
let s = unsafe {
1027+
// Safety: start and end are valid position because we got them from
1028+
// `self.input`
1029+
l.input.slice(slice_start, end)
1030+
};
1031+
buf.push_str(s);
1032+
}
1033+
10051034
if let Some(chars) = l.read_escaped_char(false)? {
10061035
for c in chars {
1007-
out.extend(c);
1036+
buf.extend(c);
10081037
}
10091038
}
1039+
1040+
slice_start = l.cur_pos();
1041+
continue;
10101042
}
1011-
c if c.is_line_break() => {
1043+
1044+
if (c as char).is_line_break() {
10121045
break;
10131046
}
1014-
_ => {
1015-
out.push(c);
10161047

1017-
l.bump();
1048+
unsafe {
1049+
// Safety: cur is a ascii character
1050+
l.input.bump();
10181051
}
1052+
continue;
10191053
}
1054+
1055+
match l.input.cur() {
1056+
Some(c) => {
1057+
if c.is_line_break() {
1058+
break;
1059+
}
1060+
unsafe {
1061+
// Safety: cur is Some(c)
1062+
l.input.bump();
1063+
}
1064+
}
1065+
None => break,
1066+
}
1067+
}
1068+
1069+
{
1070+
let end = l.cur_pos();
1071+
let s = unsafe {
1072+
// Safety: start and end are valid position because we got them from
1073+
// `self.input`
1074+
l.input.slice(slice_start, end)
1075+
};
1076+
buf.push_str(s);
10201077
}
10211078

10221079
l.emit_error(start, SyntaxError::UnterminatedStrLit);
@@ -1029,7 +1086,7 @@ impl<'a> Lexer<'a> {
10291086
l.input.slice(start, end)
10301087
};
10311088
Ok(Token::Str {
1032-
value: l.atoms.atom(&*out),
1089+
value: l.atoms.atom(&*buf),
10331090
raw: l.atoms.atom(raw),
10341091
})
10351092
})

1 commit comments

Comments
 (1)

github-actions[bot] commented on Jun 18, 2024

@github-actions[bot]

Benchmark

Benchmark suite Current: 373bac5 Previous: 6426928 Ratio
es/full/bugs-1 273315 ns/iter (± 13666) 297024 ns/iter (± 6679) 0.92
es/full/minify/libraries/antd 1875331502 ns/iter (± 48111854) 2042491599 ns/iter (± 38561340) 0.92
es/full/minify/libraries/d3 354431576 ns/iter (± 4487176) 399571106 ns/iter (± 5078299) 0.89
es/full/minify/libraries/echarts 1587068452 ns/iter (± 24860863) 1734434572 ns/iter (± 15325791) 0.92
es/full/minify/libraries/jquery 104756977 ns/iter (± 596776) 106245144 ns/iter (± 1223850) 0.99
es/full/minify/libraries/lodash 116361001 ns/iter (± 863675) 117047242 ns/iter (± 883997) 0.99
es/full/minify/libraries/moment 60229654 ns/iter (± 197422) 60489422 ns/iter (± 285608) 1.00
es/full/minify/libraries/react 18514501 ns/iter (± 68139) 18538061 ns/iter (± 62908) 1.00
es/full/minify/libraries/terser 294793222 ns/iter (± 5755381) 304982350 ns/iter (± 2473360) 0.97
es/full/minify/libraries/three 500099343 ns/iter (± 6031104) 552215413 ns/iter (± 7244349) 0.91
es/full/minify/libraries/typescript 3283670699 ns/iter (± 38211593) 3436816600 ns/iter (± 37297033) 0.96
es/full/minify/libraries/victory 800527265 ns/iter (± 30158638) 947376612 ns/iter (± 18884928) 0.84
es/full/minify/libraries/vue 149154830 ns/iter (± 778973) 150922506 ns/iter (± 1553895) 0.99
es/full/codegen/es3 59670 ns/iter (± 464) 59721 ns/iter (± 127) 1.00
es/full/codegen/es5 59701 ns/iter (± 170) 60408 ns/iter (± 415) 0.99
es/full/codegen/es2015 59838 ns/iter (± 132) 59830 ns/iter (± 364) 1.00
es/full/codegen/es2016 59775 ns/iter (± 916) 59690 ns/iter (± 154) 1.00
es/full/codegen/es2017 59755 ns/iter (± 151) 59707 ns/iter (± 120) 1.00
es/full/codegen/es2018 60325 ns/iter (± 442) 59615 ns/iter (± 80) 1.01
es/full/codegen/es2019 60214 ns/iter (± 360) 59724 ns/iter (± 90) 1.01
es/full/codegen/es2020 60755 ns/iter (± 232) 59536 ns/iter (± 183) 1.02
es/full/all/es3 162322991 ns/iter (± 912394) 165812330 ns/iter (± 1797687) 0.98
es/full/all/es5 156882552 ns/iter (± 1064118) 160719582 ns/iter (± 820091) 0.98
es/full/all/es2015 116576381 ns/iter (± 794122) 118681865 ns/iter (± 880279) 0.98
es/full/all/es2016 115321560 ns/iter (± 722814) 116768359 ns/iter (± 586376) 0.99
es/full/all/es2017 115480182 ns/iter (± 752673) 116329269 ns/iter (± 737134) 0.99
es/full/all/es2018 112385488 ns/iter (± 634677) 114434726 ns/iter (± 730841) 0.98
es/full/all/es2019 111802739 ns/iter (± 517531) 114966667 ns/iter (± 758900) 0.97
es/full/all/es2020 108225624 ns/iter (± 723372) 109703594 ns/iter (± 841774) 0.99
es/full/parser 466283 ns/iter (± 2069) 484361 ns/iter (± 5510) 0.96
es/full/base/fixer 16208 ns/iter (± 196) 15163 ns/iter (± 69) 1.07
es/full/base/resolver_and_hygiene 81098 ns/iter (± 146) 78937 ns/iter (± 241) 1.03
serialization of serde 276 ns/iter (± 6) 278 ns/iter (± 9) 0.99
css/minify/libraries/bootstrap 22377661 ns/iter (± 166018) 21893721 ns/iter (± 250957) 1.02
css/visitor/compare/clone 1398601 ns/iter (± 18530) 1397438 ns/iter (± 10792) 1.00
css/visitor/compare/visit_mut_span 1535754 ns/iter (± 20597) 1518919 ns/iter (± 7985) 1.01
css/visitor/compare/visit_mut_span_panic 1542691 ns/iter (± 29365) 1536625 ns/iter (± 19884) 1.00
css/visitor/compare/fold_span 2036408 ns/iter (± 11176) 2062027 ns/iter (± 5090) 0.99
css/visitor/compare/fold_span_panic 2163000 ns/iter (± 34252) 2172400 ns/iter (± 4738) 1.00
css/lexer/bootstrap_5_1_3 3442449 ns/iter (± 47200) 3401658 ns/iter (± 14751) 1.01
css/lexer/foundation_6_7_4 2792809 ns/iter (± 7793) 2757338 ns/iter (± 5598) 1.01
css/lexer/tailwind_3_1_1 532626 ns/iter (± 28963) 526137 ns/iter (± 322) 1.01
css/parser/bootstrap_5_1_3 16221265 ns/iter (± 107573) 16163314 ns/iter (± 45578) 1.00
css/parser/foundation_6_7_4 13040985 ns/iter (± 195431) 12885701 ns/iter (± 222570) 1.01
css/parser/tailwind_3_1_1 2533231 ns/iter (± 38561) 2557413 ns/iter (± 5409) 0.99
es/codegen/colors 729550 ns/iter (± 402946) 708556 ns/iter (± 390355) 1.03
es/codegen/large 3055805 ns/iter (± 1614404) 2994189 ns/iter (± 1603183) 1.02
es/codegen/with-parser/colors 42045 ns/iter (± 222) 41699 ns/iter (± 455) 1.01
es/codegen/with-parser/large 455895 ns/iter (± 3960) 454473 ns/iter (± 1961) 1.00
es/minify/libraries/antd 1438903021 ns/iter (± 31497960) 1660150750 ns/iter (± 41553547) 0.87
es/minify/libraries/d3 282781904 ns/iter (± 5193951) 358788890 ns/iter (± 9621500) 0.79
es/minify/libraries/echarts 1161394999 ns/iter (± 15118643) 1385004459 ns/iter (± 14609561) 0.84
es/minify/libraries/jquery 82594751 ns/iter (± 220033) 93671740 ns/iter (± 1711064) 0.88
es/minify/libraries/lodash 104361795 ns/iter (± 366858) 110726655 ns/iter (± 1081675) 0.94
es/minify/libraries/moment 48132569 ns/iter (± 125636) 50175406 ns/iter (± 186715) 0.96
es/minify/libraries/react 16168719 ns/iter (± 15812) 16978034 ns/iter (± 50489) 0.95
es/minify/libraries/terser 217384124 ns/iter (± 279040) 270567467 ns/iter (± 4070915) 0.80
es/minify/libraries/three 362936763 ns/iter (± 1070722) 474270540 ns/iter (± 4942209) 0.77
es/minify/libraries/typescript 2709351465 ns/iter (± 25866724) 2927273049 ns/iter (± 26912059) 0.93
es/minify/libraries/victory 577062492 ns/iter (± 10963378) 710420356 ns/iter (± 16964886) 0.81
es/minify/libraries/vue 121019079 ns/iter (± 363143) 122790668 ns/iter (± 711362) 0.99
es/visitor/compare/clone 1716597 ns/iter (± 24197) 1683744 ns/iter (± 6686) 1.02
es/visitor/compare/visit_mut_span 2066102 ns/iter (± 30572) 2020696 ns/iter (± 9239) 1.02
es/visitor/compare/visit_mut_span_panic 2050179 ns/iter (± 71382) 2016470 ns/iter (± 20993) 1.02
es/visitor/compare/fold_span 2768895 ns/iter (± 10236) 2727865 ns/iter (± 5929) 1.02
es/visitor/compare/fold_span_panic 2802691 ns/iter (± 6067) 2763366 ns/iter (± 3169) 1.01
es/lexer/colors 9779 ns/iter (± 85) 9777 ns/iter (± 26) 1.00
es/lexer/angular 5245044 ns/iter (± 23059) 5117679 ns/iter (± 23055) 1.02
es/lexer/backbone 637692 ns/iter (± 3779) 660840 ns/iter (± 2682) 0.96
es/lexer/jquery 3718545 ns/iter (± 26902) 3566791 ns/iter (± 3809) 1.04
es/lexer/jquery mobile 5652660 ns/iter (± 7681) 5345639 ns/iter (± 14445) 1.06
es/lexer/mootools 2860997 ns/iter (± 1648) 2875128 ns/iter (± 21553) 1.00
es/lexer/underscore 538161 ns/iter (± 613) 532769 ns/iter (± 602) 1.01
es/lexer/three 16259224 ns/iter (± 69600) 16331780 ns/iter (± 94428) 1.00
es/lexer/yui 2989888 ns/iter (± 12024) 2970361 ns/iter (± 3873) 1.01
es/lexer/cal-com 12826096 ns/iter (± 17368) 12982352 ns/iter (± 43846) 0.99
es/lexer/typescript 90786058 ns/iter (± 447925) 90949731 ns/iter (± 447483) 1.00
es/parser/colors 24644 ns/iter (± 77) 24580 ns/iter (± 124) 1.00
es/parser/angular 12476036 ns/iter (± 56728) 12424789 ns/iter (± 147560) 1.00
es/parser/backbone 1843279 ns/iter (± 11856) 1835741 ns/iter (± 8000) 1.00
es/parser/jquery 10111584 ns/iter (± 77560) 10093791 ns/iter (± 160507) 1.00
es/parser/jquery mobile 15323886 ns/iter (± 83830) 15268349 ns/iter (± 97897) 1.00
es/parser/mootools 7907871 ns/iter (± 31436) 7846791 ns/iter (± 14183) 1.01
es/parser/underscore 1608133 ns/iter (± 4608) 1594569 ns/iter (± 8927) 1.01
es/parser/three 44386499 ns/iter (± 667571) 43655555 ns/iter (± 294234) 1.02
es/parser/yui 7465653 ns/iter (± 38237) 7496580 ns/iter (± 45866) 1.00
es/parser/cal-com 39841493 ns/iter (± 141524) 39928200 ns/iter (± 260500) 1.00
es/parser/typescript 267590754 ns/iter (± 867934) 269758547 ns/iter (± 1236592) 0.99
es/preset-env/usage/builtin_type 135913 ns/iter (± 34839) 136454 ns/iter (± 34767) 1.00
es/preset-env/usage/property 16532 ns/iter (± 57) 16620 ns/iter (± 121) 0.99
es/resolver/typescript 102170531 ns/iter (± 3317082) 100034028 ns/iter (± 2698678) 1.02
es/fixer/typescript 81553860 ns/iter (± 3098715) 79478664 ns/iter (± 4749582) 1.03
es/hygiene/typescript 190743227 ns/iter (± 7231408) 184559918 ns/iter (± 5411647) 1.03
es/resolver_with_hygiene/typescript 310795961 ns/iter (± 3623176) 310996032 ns/iter (± 3411752) 1.00
es/visitor/base-perf/module_clone 58044 ns/iter (± 2045) 56763 ns/iter (± 912) 1.02
es/visitor/base-perf/fold_empty 61310 ns/iter (± 816) 60222 ns/iter (± 794) 1.02
es/visitor/base-perf/fold_noop_impl_all 61413 ns/iter (± 741) 60745 ns/iter (± 838) 1.01
es/visitor/base-perf/fold_noop_impl_vec 61898 ns/iter (± 1201) 60627 ns/iter (± 680) 1.02
es/visitor/base-perf/boxing_boxed_clone 60 ns/iter (± 1) 58 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_unboxed_clone 47 ns/iter (± 0) 47 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 105 ns/iter (± 0) 106 ns/iter (± 0) 0.99
es/visitor/base-perf/boxing_unboxed 80 ns/iter (± 0) 82 ns/iter (± 0) 0.98
es/visitor/base-perf/visit_contains_this 2527 ns/iter (± 23) 2462 ns/iter (± 19) 1.03
es/base/parallel/resolver/typescript 2307668317 ns/iter (± 148917439) 2422314327 ns/iter (± 106731532) 0.95
es/base/parallel/hygiene/typescript 3197996952 ns/iter (± 66385536) 3215614515 ns/iter (± 32862941) 0.99
babelify-only 475654 ns/iter (± 13969) 480027 ns/iter (± 5987) 0.99
parse_and_babelify_angular 42555573 ns/iter (± 1067590) 38738072 ns/iter (± 999683) 1.10
parse_and_babelify_backbone 4336189 ns/iter (± 24888) 4750652 ns/iter (± 190392) 0.91
parse_and_babelify_jquery 28397292 ns/iter (± 202083) 30361717 ns/iter (± 876596) 0.94
parse_and_babelify_jquery_mobile 48732674 ns/iter (± 668160) 49935560 ns/iter (± 879279) 0.98
parse_and_babelify_mootools 25478322 ns/iter (± 148549) 26698334 ns/iter (± 482395) 0.95
parse_and_babelify_underscore 3675846 ns/iter (± 15368) 3698352 ns/iter (± 39655) 0.99
parse_and_babelify_yui 23380429 ns/iter (± 218225) 24989030 ns/iter (± 909478) 0.94
html/minify/document/css_spec 46850237 ns/iter (± 533417) 45612799 ns/iter (± 474317) 1.03
html/minify/document/github 18562822 ns/iter (± 59242) 17858159 ns/iter (± 85105) 1.04
html/minify/document/stackoverflow 16952254 ns/iter (± 433898) 16248417 ns/iter (± 487811) 1.04
html/minify/document_fragment/css_spec 47979371 ns/iter (± 529780) 44263581 ns/iter (± 416858) 1.08
html/minify/document_fragment/github 18414403 ns/iter (± 78804) 17603939 ns/iter (± 18626) 1.05
html/minify/document_fragment/stackoverflow 16781322 ns/iter (± 49917) 16152566 ns/iter (± 86207) 1.04
html/document/visitor/compare/clone 167704 ns/iter (± 2485) 165725 ns/iter (± 1972) 1.01
html/document/visitor/compare/visit_mut_span 182054 ns/iter (± 1824) 182728 ns/iter (± 1500) 1.00
html/document/visitor/compare/visit_mut_span_panic 186077 ns/iter (± 4278) 187768 ns/iter (± 3108) 0.99
html/document/visitor/compare/fold_span 227959 ns/iter (± 1145) 228793 ns/iter (± 2647) 1.00
html/document/visitor/compare/fold_span_panic 280083 ns/iter (± 845) 276339 ns/iter (± 1660) 1.01
html/document_fragment/visitor/compare/clone 164404 ns/iter (± 1456) 165107 ns/iter (± 905) 1.00
html/document_fragment/visitor/compare/visit_mut_span 184777 ns/iter (± 1110) 183506 ns/iter (± 1365) 1.01
html/document_fragment/visitor/compare/visit_mut_span_panic 188851 ns/iter (± 1184) 185667 ns/iter (± 1371) 1.02
html/document_fragment/visitor/compare/fold_span 229400 ns/iter (± 1130) 229095 ns/iter (± 819) 1.00
html/document_fragment/visitor/compare/fold_span_panic 279645 ns/iter (± 1247) 277934 ns/iter (± 9473) 1.01
html/lexer/css_2021_spec 12948537 ns/iter (± 85065) 12949772 ns/iter (± 135368) 1.00
html/lexer/github_com_17_05_2022 4927845 ns/iter (± 6181) 4932298 ns/iter (± 70224) 1.00
html/lexer/stackoverflow_com_17_05_2022 4681862 ns/iter (± 15539) 4683889 ns/iter (± 3603) 1.00
html/parser/parser_document/css_2021_spec 25316715 ns/iter (± 80065) 26197956 ns/iter (± 351280) 0.97
html/parser/parser_document/github_com_17_05_2022 8528045 ns/iter (± 77810) 8628078 ns/iter (± 60969) 0.99
html/parser/parser_document/stackoverflow_com_17_05_2022 7461070 ns/iter (± 44005) 7463495 ns/iter (± 10622) 1.00
html/parser/parser_document_fragment/css_2021_spec 25174648 ns/iter (± 101167) 25300387 ns/iter (± 283278) 1.00
html/parser/parser_document_fragment/github_com_17_05_2022 8457509 ns/iter (± 35072) 8517107 ns/iter (± 71188) 0.99
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7453820 ns/iter (± 7830) 7396567 ns/iter (± 38730) 1.01

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

Please sign in to comment.