Skip to content

Commit

Permalink
perf(es/react): Don't use regex (#7284)
Browse files Browse the repository at this point in the history
**Description:**

It's causing a performance problem in concurrent scenarios.

x-ref: https://linear.app/vercel/issue/WEB-921
x-ref: https://vercel.slack.com/archives/C02HY34AKME/p1681757237489689
  • Loading branch information
kdy1 committed Apr 18, 2023
1 parent e757e65 commit 248fd37
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 12 deletions.
1 change: 0 additions & 1 deletion Cargo.lock

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

1 change: 0 additions & 1 deletion crates/swc_ecma_transforms_react/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ dashmap = "5.1.0"
indexmap = "1.6.1"
once_cell = "1.10.0"
rayon = { version = "1.5.1", optional = true }
regex = "1.4.2"
serde = { version = "1.0.118", features = ["derive"], optional = true }
sha-1 = "=0.10.0"

Expand Down
8 changes: 2 additions & 6 deletions crates/swc_ecma_transforms_react/src/jsx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

use std::{borrow::Cow, iter, iter::once, sync::Arc};

use once_cell::sync::Lazy;
use regex::Regex;
use serde::{Deserialize, Serialize};
use string_enum::StringEnum;
use swc_atoms::{js_word, Atom, JsWord};
Expand Down Expand Up @@ -1251,8 +1249,6 @@ fn to_prop_name(n: JSXAttrName) -> PropName {

#[inline]
fn jsx_text_to_str(t: Atom) -> JsWord {
static SPACE_START: Lazy<Regex> = Lazy::new(|| Regex::new("^[ ]+").unwrap());
static SPACE_END: Lazy<Regex> = Lazy::new(|| Regex::new("[ ]+$").unwrap());
let mut buf = String::new();
let replaced = t.replace('\t', " ");

Expand All @@ -1262,14 +1258,14 @@ fn jsx_text_to_str(t: Atom) -> JsWord {
}
let line = Cow::from(line);
let line = if i != 0 {
SPACE_START.replace_all(&line, "")
Cow::Borrowed(line.trim_start_matches(' '))
} else {
line
};
let line = if is_last {
line
} else {
SPACE_END.replace_all(&line, "")
Cow::Borrowed(line.trim_end_matches(' '))
};
if line.len() == 0 {
continue;
Expand Down
13 changes: 9 additions & 4 deletions crates/swc_ecma_transforms_react/src/refresh/hook.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
use std::{fmt::Write, mem};

use once_cell::sync::Lazy;
use regex::Regex;
use sha1::{Digest, Sha1};
use swc_common::{util::take::Take, SourceMap, SourceMapper, Spanned, SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
Expand Down Expand Up @@ -371,7 +369,14 @@ struct HookCollector<'a> {
cm: &'a SourceMap,
}

static IS_HOOK_LIKE: Lazy<Regex> = Lazy::new(|| Regex::new("^use[A-Z]").unwrap());
fn is_hook_like(s: &str) -> bool {
if let Some(s) = s.strip_prefix("use") {
s.chars().next().map(|c| c.is_uppercase()).unwrap_or(false)
} else {
false
}
}

impl<'a> HookCollector<'a> {
fn get_hook_from_call_expr(&self, expr: &CallExpr, lhs: Option<&Pat>) -> Option<Hook> {
let callee = if let Callee::Expr(callee) = &expr.callee {
Expand All @@ -396,7 +401,7 @@ impl<'a> HookCollector<'a> {
}
_ => None,
}?;
let name = if IS_HOOK_LIKE.is_match(&ident.sym) {
let name = if is_hook_like(&ident.sym) {
Some(ident)
} else {
None
Expand Down

1 comment on commit 248fd37

@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: 248fd37 Previous: 4c06a56 Ratio
es/full/bugs-1 306429 ns/iter (± 7934) 317534 ns/iter (± 8169) 0.97
es/full/minify/libraries/antd 1550135930 ns/iter (± 21261876) 1698620871 ns/iter (± 27015444) 0.91
es/full/minify/libraries/d3 308952077 ns/iter (± 5123734) 324941152 ns/iter (± 9781325) 0.95
es/full/minify/libraries/echarts 1231211844 ns/iter (± 8996876) 1321397348 ns/iter (± 13604325) 0.93
es/full/minify/libraries/jquery 90756420 ns/iter (± 451844) 93265598 ns/iter (± 926061) 0.97
es/full/minify/libraries/lodash 105356595 ns/iter (± 895097) 108660264 ns/iter (± 2236613) 0.97
es/full/minify/libraries/moment 52271898 ns/iter (± 509825) 54096475 ns/iter (± 788997) 0.97
es/full/minify/libraries/react 19287841 ns/iter (± 124050) 20006728 ns/iter (± 253946) 0.96
es/full/minify/libraries/terser 250093827 ns/iter (± 2658546) 266285355 ns/iter (± 5438567) 0.94
es/full/minify/libraries/three 435945762 ns/iter (± 3938972) 482784766 ns/iter (± 9855111) 0.90
es/full/minify/libraries/typescript 2943543497 ns/iter (± 28049381) 3200186176 ns/iter (± 18287997) 0.92
es/full/minify/libraries/victory 674678750 ns/iter (± 9321015) 736968670 ns/iter (± 11007267) 0.92
es/full/minify/libraries/vue 130156569 ns/iter (± 1069544) 140241992 ns/iter (± 1519149) 0.93
es/full/codegen/es3 29552 ns/iter (± 103) 28786 ns/iter (± 59) 1.03
es/full/codegen/es5 29600 ns/iter (± 102) 28931 ns/iter (± 46) 1.02
es/full/codegen/es2015 29620 ns/iter (± 95) 28906 ns/iter (± 66) 1.02
es/full/codegen/es2016 29544 ns/iter (± 73) 28842 ns/iter (± 48) 1.02
es/full/codegen/es2017 29584 ns/iter (± 55) 28920 ns/iter (± 62) 1.02
es/full/codegen/es2018 29618 ns/iter (± 84) 28935 ns/iter (± 196) 1.02
es/full/codegen/es2019 29602 ns/iter (± 87) 28893 ns/iter (± 60) 1.02
es/full/codegen/es2020 29550 ns/iter (± 81) 28896 ns/iter (± 53) 1.02
es/full/all/es3 179768760 ns/iter (± 2902646) 181588554 ns/iter (± 2727377) 0.99
es/full/all/es5 174178080 ns/iter (± 4726790) 176416680 ns/iter (± 2713280) 0.99
es/full/all/es2015 135570917 ns/iter (± 1709946) 136149022 ns/iter (± 2917783) 1.00
es/full/all/es2016 133300536 ns/iter (± 2888813) 135042229 ns/iter (± 1252560) 0.99
es/full/all/es2017 131160476 ns/iter (± 2359390) 133900097 ns/iter (± 3067306) 0.98
es/full/all/es2018 125596804 ns/iter (± 2275188) 128291978 ns/iter (± 1488561) 0.98
es/full/all/es2019 122705536 ns/iter (± 980926) 126885720 ns/iter (± 1743163) 0.97
es/full/all/es2020 116990453 ns/iter (± 969526) 120346629 ns/iter (± 863639) 0.97
es/full/parser 509773 ns/iter (± 7398) 523086 ns/iter (± 10399) 0.97
es/full/base/fixer 22376 ns/iter (± 76) 22630 ns/iter (± 61) 0.99
es/full/base/resolver_and_hygiene 83658 ns/iter (± 89) 83820 ns/iter (± 76) 1.00
serialization of serde 121 ns/iter (± 0) 121 ns/iter (± 0) 1
css/minify/libraries/bootstrap 27518871 ns/iter (± 176945) 28345153 ns/iter (± 224989) 0.97
css/visitor/compare/clone 2118484 ns/iter (± 22990) 2112079 ns/iter (± 14469) 1.00
css/visitor/compare/visit_mut_span 2288249 ns/iter (± 4484) 2301077 ns/iter (± 11858) 0.99
css/visitor/compare/visit_mut_span_panic 2369503 ns/iter (± 10160) 2353396 ns/iter (± 6726) 1.01
css/visitor/compare/fold_span 3083937 ns/iter (± 9113) 3075967 ns/iter (± 15573) 1.00
css/visitor/compare/fold_span_panic 3270651 ns/iter (± 14266) 3249161 ns/iter (± 34747) 1.01
css/lexer/bootstrap_5_1_3 5118246 ns/iter (± 1870) 5140872 ns/iter (± 16931) 1.00
css/lexer/foundation_6_7_4 4313490 ns/iter (± 7046) 4407123 ns/iter (± 1340) 0.98
css/lexer/tailwind_3_1_1 820163 ns/iter (± 3084) 838633 ns/iter (± 133) 0.98
css/parser/bootstrap_5_1_3 21157331 ns/iter (± 161618) 21792515 ns/iter (± 200418) 0.97
css/parser/foundation_6_7_4 16858289 ns/iter (± 111567) 17329677 ns/iter (± 194146) 0.97
css/parser/tailwind_3_1_1 3221372 ns/iter (± 2983) 3230792 ns/iter (± 16508) 1.00
es/codegen/colors 328406 ns/iter (± 185807) 317384 ns/iter (± 179143) 1.03
es/codegen/large 1265872 ns/iter (± 642323) 1110732 ns/iter (± 556156) 1.14
es/codegen/with-parser/colors 47483 ns/iter (± 368) 47677 ns/iter (± 329) 1.00
es/codegen/with-parser/large 512306 ns/iter (± 1778) 510078 ns/iter (± 1807) 1.00
es/minify/libraries/antd 1368679796 ns/iter (± 15290414) 1516309789 ns/iter (± 25069412) 0.90
es/minify/libraries/d3 257714466 ns/iter (± 5519590) 273754591 ns/iter (± 5318527) 0.94
es/minify/libraries/echarts 1062814578 ns/iter (± 11754511) 1134299068 ns/iter (± 11037409) 0.94
es/minify/libraries/jquery 79401756 ns/iter (± 521802) 80895543 ns/iter (± 751322) 0.98
es/minify/libraries/lodash 96787693 ns/iter (± 1333250) 98514069 ns/iter (± 2147712) 0.98
es/minify/libraries/moment 46275916 ns/iter (± 429400) 46632007 ns/iter (± 444133) 0.99
es/minify/libraries/react 17220964 ns/iter (± 139640) 17836596 ns/iter (± 306210) 0.97
es/minify/libraries/terser 209299598 ns/iter (± 2536771) 227773639 ns/iter (± 5408125) 0.92
es/minify/libraries/three 363729106 ns/iter (± 4720507) 391907376 ns/iter (± 4996466) 0.93
es/minify/libraries/typescript 2524673186 ns/iter (± 16448781) 2697766931 ns/iter (± 24735433) 0.94
es/minify/libraries/victory 567149069 ns/iter (± 7489344) 614666262 ns/iter (± 13258080) 0.92
es/minify/libraries/vue 115391573 ns/iter (± 1182484) 120605464 ns/iter (± 3378199) 0.96
es/visitor/compare/clone 2371256 ns/iter (± 12284) 2345119 ns/iter (± 12533) 1.01
es/visitor/compare/visit_mut_span 2741059 ns/iter (± 3475) 2730192 ns/iter (± 22748) 1.00
es/visitor/compare/visit_mut_span_panic 2792518 ns/iter (± 5074) 2801438 ns/iter (± 33264) 1.00
es/visitor/compare/fold_span 3862726 ns/iter (± 10078) 3864667 ns/iter (± 48121) 1.00
es/visitor/compare/fold_span_panic 3989143 ns/iter (± 13820) 3963652 ns/iter (± 28310) 1.01
es/lexer/colors 13272 ns/iter (± 10) 13179 ns/iter (± 84) 1.01
es/lexer/angular 6342883 ns/iter (± 4193) 6341877 ns/iter (± 3139) 1.00
es/lexer/backbone 785855 ns/iter (± 211) 784276 ns/iter (± 255) 1.00
es/lexer/jquery 4399531 ns/iter (± 4220) 4402704 ns/iter (± 2266) 1.00
es/lexer/jquery mobile 6865002 ns/iter (± 19761) 6856969 ns/iter (± 3877) 1.00
es/lexer/mootools 3454393 ns/iter (± 1776) 3448373 ns/iter (± 12895) 1.00
es/lexer/underscore 648515 ns/iter (± 531) 648331 ns/iter (± 216) 1.00
es/lexer/three 20732722 ns/iter (± 35260) 20715519 ns/iter (± 17040) 1.00
es/lexer/yui 3853385 ns/iter (± 2606) 3848409 ns/iter (± 1455) 1.00
es/parser/colors 29108 ns/iter (± 53) 29149 ns/iter (± 101) 1.00
es/parser/angular 15124349 ns/iter (± 226411) 15594658 ns/iter (± 235760) 0.97
es/parser/backbone 2173371 ns/iter (± 13528) 2176726 ns/iter (± 9614) 1.00
es/parser/jquery 11988552 ns/iter (± 133351) 12086654 ns/iter (± 236745) 0.99
es/parser/jquery mobile 19048748 ns/iter (± 233889) 19446462 ns/iter (± 453111) 0.98
es/parser/mootools 9054192 ns/iter (± 31215) 9088185 ns/iter (± 66404) 1.00
es/parser/underscore 1840348 ns/iter (± 11226) 1834779 ns/iter (± 9450) 1.00
es/parser/three 54861701 ns/iter (± 1141969) 56411369 ns/iter (± 261547) 0.97
es/parser/yui 9061462 ns/iter (± 63316) 9222358 ns/iter (± 71371) 0.98
es/preset-env/usage/builtin_type 140753 ns/iter (± 34217) 142263 ns/iter (± 35279) 0.99
es/preset-env/usage/property 19681 ns/iter (± 140) 19456 ns/iter (± 117) 1.01
es/resolver/typescript 112840517 ns/iter (± 1450876) 119911636 ns/iter (± 1652240) 0.94
es/fixer/typescript 80730414 ns/iter (± 1320308) 87639762 ns/iter (± 339142) 0.92
es/hygiene/typescript 174890933 ns/iter (± 1196728) 192829556 ns/iter (± 2255810) 0.91
es/resolver_with_hygiene/typescript 310305335 ns/iter (± 2310517) 334131215 ns/iter (± 3062838) 0.93
es/visitor/base-perf/module_clone 81397 ns/iter (± 422) 80972 ns/iter (± 672) 1.01
es/visitor/base-perf/fold_empty 90541 ns/iter (± 194) 90869 ns/iter (± 486) 1.00
es/visitor/base-perf/fold_noop_impl_all 90922 ns/iter (± 279) 91270 ns/iter (± 454) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91298 ns/iter (± 484) 91357 ns/iter (± 322) 1.00
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 56 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 43 ns/iter (± 0) 41 ns/iter (± 0) 1.05
es/visitor/base-perf/boxing_boxed 103 ns/iter (± 0) 102 ns/iter (± 0) 1.01
es/visitor/base-perf/boxing_unboxed 77 ns/iter (± 0) 79 ns/iter (± 0) 0.97
es/visitor/base-perf/visit_contains_this 3563 ns/iter (± 58) 3561 ns/iter (± 67) 1.00
es/base/parallel/resolver/typescript 6081895413 ns/iter (± 493613915) 6630248908 ns/iter (± 463237642) 0.92
es/base/parallel/hygiene/typescript 2005573460 ns/iter (± 13225617) 2180321177 ns/iter (± 27388979) 0.92
misc/visitors/time-complexity/time 5 105 ns/iter (± 0) 105 ns/iter (± 0) 1
misc/visitors/time-complexity/time 10 345 ns/iter (± 4) 340 ns/iter (± 1) 1.01
misc/visitors/time-complexity/time 15 658 ns/iter (± 0) 658 ns/iter (± 5) 1
misc/visitors/time-complexity/time 20 1221 ns/iter (± 6) 1220 ns/iter (± 0) 1.00
misc/visitors/time-complexity/time 40 6211 ns/iter (± 21) 6200 ns/iter (± 18) 1.00
misc/visitors/time-complexity/time 60 15683 ns/iter (± 33) 15595 ns/iter (± 63) 1.01
es/full-target/es2016 255147 ns/iter (± 8568) 254338 ns/iter (± 1146) 1.00
es/full-target/es2017 246827 ns/iter (± 322) 246613 ns/iter (± 694) 1.00
es/full-target/es2018 236017 ns/iter (± 268) 235389 ns/iter (± 333) 1.00
es2020_nullish_coalescing 93443 ns/iter (± 403) 93311 ns/iter (± 339) 1.00
es2020_optional_chaining 125185 ns/iter (± 351) 125285 ns/iter (± 414) 1.00
es2022_class_properties 149320 ns/iter (± 337) 149601 ns/iter (± 369) 1.00
es2018_object_rest_spread 96355 ns/iter (± 216) 96100 ns/iter (± 237) 1.00
es2019_optional_catch_binding 85380 ns/iter (± 303) 85402 ns/iter (± 137) 1.00
es2017_async_to_generator 85682 ns/iter (± 136) 85731 ns/iter (± 227) 1.00
es2016_exponentiation 90574 ns/iter (± 195) 90046 ns/iter (± 246) 1.01
es2015_arrow 93850 ns/iter (± 198) 94147 ns/iter (± 264) 1.00
es2015_block_scoped_fn 92624 ns/iter (± 157) 92121 ns/iter (± 188) 1.01
es2015_block_scoping 169917 ns/iter (± 108) 170056 ns/iter (± 316) 1.00

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

Please sign in to comment.