Skip to content

Commit

Permalink
perf(es/parser): Use Cow for _ in numeric literals (#7031)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Mar 8, 2023
1 parent 56aac67 commit 30546a2
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 10 deletions.
12 changes: 12 additions & 0 deletions Cargo.lock

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

1 change: 1 addition & 0 deletions crates/swc_ecma_parser/Cargo.toml
Expand Up @@ -30,6 +30,7 @@ lexical = { version = "6.1.0", features = ["power-of-two"] }
num-bigint = "0.4"
serde = { version = "1", features = ["derive"] }
smallvec = "1.8.0"
smartstring = "1"
swc_atoms = { version = "0.4.39", path = "../swc_atoms" }
swc_common = { version = "0.29.35", path = "../swc_common" }
swc_ecma_ast = { version = "0.98.2", path = "../swc_ecma_ast" }
Expand Down
26 changes: 16 additions & 10 deletions crates/swc_ecma_parser/src/lexer/number.rs
Expand Up @@ -2,7 +2,7 @@
//!
//!
//! See https://tc39.github.io/ecma262/#sec-literals-numeric-literals
use std::fmt::Write;
use std::{borrow::Cow, fmt::Write};

use either::Either;
use num_bigint::BigInt as BigIntValue;
Expand Down Expand Up @@ -153,11 +153,14 @@ impl<'a> Lexer<'a> {
raw_val.push_str(raw.0.as_ref().unwrap());
}

raw_val
// Remove number separator from number
.replace('_', "")
.parse()
.expect("failed to parse float using rust's impl")
// Remove number separator from number
if raw_val.contains('_') {
Cow::Owned(raw_val.replace('_', ""))
} else {
Cow::Borrowed(&raw_val)
}
.parse()
.expect("failed to parse float using rust's impl")
};
}

Expand Down Expand Up @@ -210,10 +213,13 @@ impl<'a> Lexer<'a> {

write!(raw_val, "{}", exp).unwrap();

raw_val
.replace('_', "")
.parse()
.expect("failed to parse float literal")
if raw_val.contains('_') {
Cow::Owned(raw_val.replace('_', ""))
} else {
Cow::Borrowed(&raw_val)
}
.parse()
.expect("failed to parse float literal")
}
}
_ => {}
Expand Down

2 comments on commit 30546a2

@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: 30546a2 Previous: 9841f0b Ratio
es/full/bugs-1 308691 ns/iter (± 10134) 300287 ns/iter (± 21618) 1.03
es/full/minify/libraries/antd 1751724270 ns/iter (± 19340256) 1609765191 ns/iter (± 15641152) 1.09
es/full/minify/libraries/d3 320656445 ns/iter (± 10562550) 304276878 ns/iter (± 6419629) 1.05
es/full/minify/libraries/echarts 1342638358 ns/iter (± 20243237) 1232869112 ns/iter (± 12836959) 1.09
es/full/minify/libraries/jquery 95525255 ns/iter (± 1805152) 91621720 ns/iter (± 746293) 1.04
es/full/minify/libraries/lodash 108806262 ns/iter (± 1185221) 108001620 ns/iter (± 779464) 1.01
es/full/minify/libraries/moment 53901113 ns/iter (± 359531) 53382472 ns/iter (± 444199) 1.01
es/full/minify/libraries/react 19531701 ns/iter (± 161844) 19137381 ns/iter (± 98320) 1.02
es/full/minify/libraries/terser 260149328 ns/iter (± 6098030) 248817729 ns/iter (± 2465584) 1.05
es/full/minify/libraries/three 483958164 ns/iter (± 9496251) 436786980 ns/iter (± 4172179) 1.11
es/full/minify/libraries/typescript 3239695483 ns/iter (± 26966879) 3042661931 ns/iter (± 14011092) 1.06
es/full/minify/libraries/victory 704109377 ns/iter (± 17862017) 673880768 ns/iter (± 13729348) 1.04
es/full/minify/libraries/vue 133287401 ns/iter (± 986763) 132771792 ns/iter (± 1350490) 1.00
es/full/codegen/es3 25853 ns/iter (± 53) 26398 ns/iter (± 103) 0.98
es/full/codegen/es5 25937 ns/iter (± 70) 26457 ns/iter (± 31) 0.98
es/full/codegen/es2015 25959 ns/iter (± 43) 26487 ns/iter (± 65) 0.98
es/full/codegen/es2016 25946 ns/iter (± 47) 26420 ns/iter (± 32) 0.98
es/full/codegen/es2017 25901 ns/iter (± 39) 26423 ns/iter (± 53) 0.98
es/full/codegen/es2018 25927 ns/iter (± 54) 26466 ns/iter (± 68) 0.98
es/full/codegen/es2019 25935 ns/iter (± 56) 26392 ns/iter (± 68) 0.98
es/full/codegen/es2020 25966 ns/iter (± 49) 26329 ns/iter (± 47) 0.99
es/full/all/es3 173812972 ns/iter (± 1776357) 171529630 ns/iter (± 2467278) 1.01
es/full/all/es5 164663680 ns/iter (± 3071591) 164607966 ns/iter (± 2041294) 1.00
es/full/all/es2015 124833688 ns/iter (± 1899515) 123982971 ns/iter (± 663841) 1.01
es/full/all/es2016 124514332 ns/iter (± 1508106) 122986438 ns/iter (± 1861836) 1.01
es/full/all/es2017 124729030 ns/iter (± 1651546) 121330565 ns/iter (± 1277445) 1.03
es/full/all/es2018 121478522 ns/iter (± 1608573) 118852531 ns/iter (± 917286) 1.02
es/full/all/es2019 120486004 ns/iter (± 1455347) 118598300 ns/iter (± 881648) 1.02
es/full/all/es2020 116051970 ns/iter (± 1550696) 114803335 ns/iter (± 681469) 1.01
es/full/parser 537153 ns/iter (± 5419) 529523 ns/iter (± 7523) 1.01
es/full/base/fixer 21963 ns/iter (± 29) 21875 ns/iter (± 66) 1.00
es/full/base/resolver_and_hygiene 83731 ns/iter (± 102) 81604 ns/iter (± 100) 1.03
serialization of ast node 128 ns/iter (± 0) 126 ns/iter (± 0) 1.02
serialization of serde 129 ns/iter (± 0) 129 ns/iter (± 1) 1
css/minify/libraries/bootstrap 28200817 ns/iter (± 128521) 28118248 ns/iter (± 155988) 1.00
css/visitor/compare/clone 2085838 ns/iter (± 7117) 2120494 ns/iter (± 5939) 0.98
css/visitor/compare/visit_mut_span 2279832 ns/iter (± 7744) 2302380 ns/iter (± 4834) 0.99
css/visitor/compare/visit_mut_span_panic 2342435 ns/iter (± 7589) 2363655 ns/iter (± 6316) 0.99
css/visitor/compare/fold_span 3074026 ns/iter (± 25106) 3066828 ns/iter (± 26503) 1.00
css/visitor/compare/fold_span_panic 3164807 ns/iter (± 23218) 3203215 ns/iter (± 10732) 0.99
css/lexer/bootstrap_5_1_3 5232821 ns/iter (± 4405) 5246259 ns/iter (± 8626) 1.00
css/lexer/foundation_6_7_4 4408831 ns/iter (± 5016) 4418500 ns/iter (± 6842) 1.00
css/lexer/tailwind_3_1_1 838402 ns/iter (± 203) 840936 ns/iter (± 721) 1.00
css/parser/bootstrap_5_1_3 22014413 ns/iter (± 56047) 22079776 ns/iter (± 75848) 1.00
css/parser/foundation_6_7_4 17472794 ns/iter (± 29193) 17613195 ns/iter (± 39672) 0.99
css/parser/tailwind_3_1_1 3358491 ns/iter (± 2643) 3370603 ns/iter (± 6205) 1.00
es/codegen/colors 332969 ns/iter (± 187250) 328968 ns/iter (± 184255) 1.01
es/codegen/large 2448913 ns/iter (± 1638645) 1179477 ns/iter (± 600450) 2.08
es/codegen/with-parser/colors 47036 ns/iter (± 354) 48075 ns/iter (± 110) 0.98
es/codegen/with-parser/large 521522 ns/iter (± 1125) 525506 ns/iter (± 2327) 0.99
es/minify/libraries/antd 1511602861 ns/iter (± 37090551) 1395021983 ns/iter (± 23465358) 1.08
es/minify/libraries/d3 260080807 ns/iter (± 4444792) 250832673 ns/iter (± 2691076) 1.04
es/minify/libraries/echarts 1147062634 ns/iter (± 12963991) 1056408564 ns/iter (± 6421489) 1.09
es/minify/libraries/jquery 81795537 ns/iter (± 1047382) 79973316 ns/iter (± 578954) 1.02
es/minify/libraries/lodash 97323688 ns/iter (± 1667899) 95428686 ns/iter (± 803021) 1.02
es/minify/libraries/moment 47194612 ns/iter (± 717192) 46249111 ns/iter (± 158606) 1.02
es/minify/libraries/react 17198354 ns/iter (± 403324) 17060912 ns/iter (± 87313) 1.01
es/minify/libraries/terser 218759285 ns/iter (± 2874161) 210433547 ns/iter (± 1363661) 1.04
es/minify/libraries/three 395340686 ns/iter (± 10896672) 370657058 ns/iter (± 7374919) 1.07
es/minify/libraries/typescript 2772569701 ns/iter (± 21097491) 2575649594 ns/iter (± 13880106) 1.08
es/minify/libraries/victory 629499619 ns/iter (± 18721940) 558388682 ns/iter (± 5995785) 1.13
es/minify/libraries/vue 118510653 ns/iter (± 1482664) 116618368 ns/iter (± 1149968) 1.02
es/visitor/compare/clone 2410233 ns/iter (± 10082) 2363028 ns/iter (± 12252) 1.02
es/visitor/compare/visit_mut_span 2792034 ns/iter (± 4166) 2767504 ns/iter (± 4714) 1.01
es/visitor/compare/visit_mut_span_panic 2812923 ns/iter (± 5841) 2804178 ns/iter (± 4822) 1.00
es/visitor/compare/fold_span 3942436 ns/iter (± 8495) 3881662 ns/iter (± 10522) 1.02
es/visitor/compare/fold_span_panic 4111840 ns/iter (± 9687) 4088715 ns/iter (± 6221) 1.01
es/lexer/colors 16387 ns/iter (± 97) 16164 ns/iter (± 15) 1.01
es/lexer/angular 7899139 ns/iter (± 6672) 7733990 ns/iter (± 4281) 1.02
es/lexer/backbone 1017697 ns/iter (± 1111) 1009276 ns/iter (± 621) 1.01
es/lexer/jquery 5662511 ns/iter (± 4510) 5611194 ns/iter (± 3699) 1.01
es/lexer/jquery mobile 8704289 ns/iter (± 11368) 8628553 ns/iter (± 5642) 1.01
es/lexer/mootools 4467800 ns/iter (± 5339) 4426684 ns/iter (± 2829) 1.01
es/lexer/underscore 848057 ns/iter (± 319) 841955 ns/iter (± 455) 1.01
es/lexer/three 26457564 ns/iter (± 22485) 26373731 ns/iter (± 25383) 1.00
es/lexer/yui 4850256 ns/iter (± 9211) 4784364 ns/iter (± 5511) 1.01
es/parser/colors 30432 ns/iter (± 63) 30176 ns/iter (± 159) 1.01
es/parser/angular 15750636 ns/iter (± 183844) 15554304 ns/iter (± 116444) 1.01
es/parser/backbone 2307178 ns/iter (± 18768) 2284470 ns/iter (± 12659) 1.01
es/parser/jquery 12382419 ns/iter (± 52059) 12222433 ns/iter (± 53914) 1.01
es/parser/jquery mobile 19826027 ns/iter (± 523047) 19273994 ns/iter (± 129217) 1.03
es/parser/mootools 9558940 ns/iter (± 28436) 9458320 ns/iter (± 21089) 1.01
es/parser/underscore 1954066 ns/iter (± 11270) 1944313 ns/iter (± 11729) 1.01
es/parser/three 58755787 ns/iter (± 973058) 56142853 ns/iter (± 464226) 1.05
es/parser/yui 9582247 ns/iter (± 52432) 9453578 ns/iter (± 48489) 1.01
es/preset-env/usage/builtin_type 140167 ns/iter (± 31547) 146976 ns/iter (± 34613) 0.95
es/preset-env/usage/property 20773 ns/iter (± 58) 21303 ns/iter (± 54) 0.98
es/resolver/typescript 121870712 ns/iter (± 1604819) 113006626 ns/iter (± 4805114) 1.08
es/fixer/typescript 94353791 ns/iter (± 1719521) 83876905 ns/iter (± 3596483) 1.12
es/hygiene/typescript 201142227 ns/iter (± 2071835) 180679131 ns/iter (± 1719242) 1.11
es/resolver_with_hygiene/typescript 341786418 ns/iter (± 1770591) 317211700 ns/iter (± 2543778) 1.08
es/visitor/base-perf/module_clone 77733 ns/iter (± 1885) 75849 ns/iter (± 1491) 1.02
es/visitor/base-perf/fold_empty 87473 ns/iter (± 1698) 86195 ns/iter (± 1613) 1.01
es/visitor/base-perf/fold_noop_impl_all 88745 ns/iter (± 1080) 85270 ns/iter (± 1103) 1.04
es/visitor/base-perf/fold_noop_impl_vec 88369 ns/iter (± 1825) 85514 ns/iter (± 1857) 1.03
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 57 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 61 ns/iter (± 0) 59 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_boxed 103 ns/iter (± 0) 107 ns/iter (± 0) 0.96
es/visitor/base-perf/boxing_unboxed 103 ns/iter (± 0) 106 ns/iter (± 0) 0.97
es/visitor/base-perf/visit_contains_this 3405 ns/iter (± 63) 3398 ns/iter (± 42) 1.00
es/base/parallel/resolver/typescript 5759190229 ns/iter (± 613688730) 4953561728 ns/iter (± 380981679) 1.16
es/base/parallel/hygiene/typescript 2396022358 ns/iter (± 34714357) 2142771426 ns/iter (± 35876357) 1.12
misc/visitors/time-complexity/time 5 102 ns/iter (± 0) 98 ns/iter (± 0) 1.04
misc/visitors/time-complexity/time 10 328 ns/iter (± 1) 346 ns/iter (± 0) 0.95
misc/visitors/time-complexity/time 15 692 ns/iter (± 14) 664 ns/iter (± 0) 1.04
misc/visitors/time-complexity/time 20 1259 ns/iter (± 1) 1226 ns/iter (± 0) 1.03
misc/visitors/time-complexity/time 40 6721 ns/iter (± 7) 6207 ns/iter (± 2) 1.08
misc/visitors/time-complexity/time 60 17277 ns/iter (± 42) 15597 ns/iter (± 11) 1.11
es/full-target/es2016 188276 ns/iter (± 867) 186444 ns/iter (± 709) 1.01
es/full-target/es2017 183690 ns/iter (± 425) 182197 ns/iter (± 592) 1.01
es/full-target/es2018 172279 ns/iter (± 400) 170710 ns/iter (± 243) 1.01
es2020_nullish_coalescing 67159 ns/iter (± 216) 66356 ns/iter (± 5216) 1.01
es2020_optional_chaining 96039 ns/iter (± 314) 96179 ns/iter (± 7270) 1.00
es2022_class_properties 93827 ns/iter (± 209) 94295 ns/iter (± 162) 1.00
es2018_object_rest_spread 71793 ns/iter (± 69) 71394 ns/iter (± 118) 1.01
es2019_optional_catch_binding 61646 ns/iter (± 82) 61195 ns/iter (± 79) 1.01
es2017_async_to_generator 61947 ns/iter (± 114) 61563 ns/iter (± 75) 1.01
es2016_exponentiation 64923 ns/iter (± 88) 64977 ns/iter (± 80) 1.00
es2015_arrow 70905 ns/iter (± 244) 70992 ns/iter (± 175) 1.00
es2015_block_scoped_fn 66549 ns/iter (± 178) 66087 ns/iter (± 142) 1.01
es2015_block_scoping 153825 ns/iter (± 10659) 143022 ns/iter (± 11473) 1.08
es2015_classes 117353 ns/iter (± 446) 117332 ns/iter (± 359) 1.00
es2015_computed_props 61666 ns/iter (± 123) 61206 ns/iter (± 72) 1.01
es2015_destructuring 116178 ns/iter (± 230) 116993 ns/iter (± 262) 0.99
es2015_duplicate_keys 63727 ns/iter (± 98) 63870 ns/iter (± 99) 1.00
es2015_parameters 80492 ns/iter (± 159) 79714 ns/iter (± 109) 1.01
es2015_fn_name 66630 ns/iter (± 504) 66287 ns/iter (± 524) 1.01
es2015_for_of 64817 ns/iter (± 164) 64527 ns/iter (± 65) 1.00
es2015_instanceof 63439 ns/iter (± 103) 63032 ns/iter (± 85) 1.01
es2015_shorthand_property 61473 ns/iter (± 117) 60909 ns/iter (± 112) 1.01
es2015_spread 61102 ns/iter (± 157) 60804 ns/iter (± 127) 1.00
es2015_sticky_regex 62423 ns/iter (± 119) 61958 ns/iter (± 124) 1.01
es2015_typeof_symbol 62788 ns/iter (± 181) 62501 ns/iter (± 167) 1.00
es/transform/baseline/base 52003 ns/iter (± 55) 51831 ns/iter (± 77) 1.00
es/transform/baseline/common_reserved_word 63189 ns/iter (± 148) 62610 ns/iter (± 84) 1.01
es/transform/baseline/common_typescript 141755 ns/iter (± 4904) 149477 ns/iter (± 10956) 0.95
es/target/es3 169412 ns/iter (± 264) 170062 ns/iter (± 324) 1.00
es/target/es2015 634079 ns/iter (± 1023) 632140 ns/iter (± 688) 1.00
es/target/es2016 65270 ns/iter (± 396) 64876 ns/iter (± 138) 1.01
es/target/es2017 62067 ns/iter (± 88) 61427 ns/iter (± 110) 1.01
es/target/es2018 81779 ns/iter (± 152) 80984 ns/iter (± 105) 1.01
es/target/es2020 133440 ns/iter (± 313) 132236 ns/iter (± 171) 1.01
babelify-only 671996 ns/iter (± 962) 675965 ns/iter (± 1172) 0.99
parse_and_babelify_angular 45518882 ns/iter (± 1325097) 43304878 ns/iter (± 762835) 1.05
parse_and_babelify_backbone 5508886 ns/iter (± 77784) 5476507 ns/iter (± 27431) 1.01
parse_and_babelify_jquery 32856050 ns/iter (± 380941) 32220111 ns/iter (± 304498) 1.02
parse_and_babelify_jquery_mobile 56409413 ns/iter (± 652107) 54301960 ns/iter (± 635695) 1.04
parse_and_babelify_mootools 34129638 ns/iter (± 279452) 33270600 ns/iter (± 267891) 1.03
parse_and_babelify_underscore 4411226 ns/iter (± 24736) 4380102 ns/iter (± 20677) 1.01
parse_and_babelify_yui 34672887 ns/iter (± 513145) 32699045 ns/iter (± 298343) 1.06
html/minify/document/css_spec 43249988 ns/iter (± 311615) 43041274 ns/iter (± 295966) 1.00
html/minify/document/github 17786521 ns/iter (± 52098) 17685968 ns/iter (± 28455) 1.01
html/minify/document/stackoverflow 15862914 ns/iter (± 60694) 15922989 ns/iter (± 24549) 1.00
html/minify/document_fragment/css_spec 40918892 ns/iter (± 376568) 41112395 ns/iter (± 188606) 1.00
html/minify/document_fragment/github 17024321 ns/iter (± 71017) 17017240 ns/iter (± 15469) 1.00
html/minify/document_fragment/stackoverflow 15501786 ns/iter (± 105511) 15502370 ns/iter (± 45290) 1.00
html/document/visitor/compare/clone 343022 ns/iter (± 1041) 340448 ns/iter (± 1891) 1.01
html/document/visitor/compare/visit_mut_span 369601 ns/iter (± 2354) 377289 ns/iter (± 2340) 0.98
html/document/visitor/compare/visit_mut_span_panic 377461 ns/iter (± 2144) 381921 ns/iter (± 1970) 0.99
html/document/visitor/compare/fold_span 414933 ns/iter (± 2235) 402071 ns/iter (± 2924) 1.03
html/document/visitor/compare/fold_span_panic 471469 ns/iter (± 1478) 461830 ns/iter (± 1559) 1.02
html/document_fragment/visitor/compare/clone 343173 ns/iter (± 2388) 343428 ns/iter (± 2187) 1.00
html/document_fragment/visitor/compare/visit_mut_span 377504 ns/iter (± 2276) 374395 ns/iter (± 1287) 1.01
html/document_fragment/visitor/compare/visit_mut_span_panic 377498 ns/iter (± 1505) 381843 ns/iter (± 1958) 0.99
html/document_fragment/visitor/compare/fold_span 407564 ns/iter (± 1531) 410445 ns/iter (± 2636) 0.99
html/document_fragment/visitor/compare/fold_span_panic 470600 ns/iter (± 1441) 464708 ns/iter (± 1601) 1.01
html/lexer/css_2021_spec 15652220 ns/iter (± 23336) 15764358 ns/iter (± 15169) 0.99
html/lexer/github_com_17_05_2022 6060530 ns/iter (± 18412) 6159971 ns/iter (± 9773) 0.98
html/lexer/stackoverflow_com_17_05_2022 5648385 ns/iter (± 10635) 5697541 ns/iter (± 1419) 0.99
html/parser/parser_document/css_2021_spec 26444298 ns/iter (± 299192) 26553339 ns/iter (± 142667) 1.00
html/parser/parser_document/github_com_17_05_2022 8917118 ns/iter (± 14159) 8976165 ns/iter (± 9346) 0.99
html/parser/parser_document/stackoverflow_com_17_05_2022 7875958 ns/iter (± 6379) 7790023 ns/iter (± 12198) 1.01
html/parser/parser_document_fragment/css_2021_spec 26572406 ns/iter (± 282722) 26711991 ns/iter (± 126373) 0.99
html/parser/parser_document_fragment/github_com_17_05_2022 8932844 ns/iter (± 17120) 8997556 ns/iter (± 15322) 0.99
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7874040 ns/iter (± 8603) 7803147 ns/iter (± 11724) 1.01

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

@github-actions
Copy link

Choose a reason for hiding this comment

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

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 2.

Benchmark suite Current: 30546a2 Previous: 9841f0b Ratio
es/codegen/large 2448913 ns/iter (± 1638645) 1179477 ns/iter (± 600450) 2.08

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

CC: @kdy1

Please sign in to comment.