Skip to content

Commit

Permalink
fix(es/minifier): Bailout regex optimization on invalid flags (#7020)
Browse files Browse the repository at this point in the history
  • Loading branch information
Austaras committed Mar 7, 2023
1 parent 2a8f6ae commit 1318afe
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 53 deletions.
105 changes: 54 additions & 51 deletions crates/swc_ecma_minifier/src/compress/pure/misc.rs
@@ -1,6 +1,7 @@
use std::{fmt::Write, iter::once, num::FpCategory};

use swc_atoms::js_word;
use rustc_hash::FxHashSet;
use swc_atoms::{js_word, JsWord};
use swc_common::{iter::IdentifyLast, util::take::Take, Span, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_transforms_optimization::debug_assert_valid;
Expand Down Expand Up @@ -247,76 +248,78 @@ impl Pure<'_> {

/// `new RegExp("([Sap]+)", "ig")` => `/([Sap]+)/gi`
fn optimize_regex(&mut self, args: &mut Vec<ExprOrSpread>, span: &mut Span) -> Option<Expr> {
if args.is_empty() || args.len() > 2 {
return None;
fn valid_pattern(pattern: &Expr) -> Option<JsWord> {
if let Expr::Lit(Lit::Str(s)) = pattern {
if s.value.contains(|c: char| {
// whitelist
!c.is_ascii_alphanumeric()
&& !matches!(c, '$' | '[' | ']' | '(' | ')' | '{' | '}' | '-' | '+' | '_')
}) {
None
} else {
Some(s.value.clone())
}
} else {
None
}
}
fn valid_flag(flag: &Expr, es_version: EsVersion) -> Option<JsWord> {
if let Expr::Lit(Lit::Str(s)) = flag {
let mut set = FxHashSet::default();
for c in s.value.chars() {
if !(matches!(c, 'g' | 'i' | 'm')
|| (es_version >= EsVersion::Es2015 && matches!(c, 'u' | 'y'))
|| (es_version >= EsVersion::Es2018 && matches!(c, 's')))
|| (es_version >= EsVersion::Es2022 && matches!(c, 'd'))
{
return None;
}

// We aborts the method if arguments are not literals.
if args.iter().any(|v| {
v.spread.is_some()
|| match &*v.expr {
Expr::Lit(Lit::Str(s)) => {
if s.value.contains(|c: char| {
// whitelist
!c.is_ascii_alphanumeric()
&& !matches!(c, '%' | '[' | ']' | '(' | ')' | '{' | '}' | '-' | '+')
}) {
return true;
}
if s.value.contains("\\\0") || s.value.contains('/') {
return true;
}

false
if !set.insert(c) {
return None;
}
_ => true,
}
}) {
return None;
}

let pattern = args[0].expr.take();

let pattern = match *pattern {
Expr::Lit(Lit::Str(s)) => s.value,
_ => {
unreachable!()
Some(s.value.clone())
} else {
None
}
}

let (pattern, flag) = match args.as_slice() {
[ExprOrSpread { spread: None, expr }] => (valid_pattern(expr)?, "".into()),
[ExprOrSpread {
spread: None,
expr: pattern,
}, ExprOrSpread {
spread: None,
expr: flag,
}] => (
valid_pattern(pattern)?,
valid_flag(flag, self.options.ecma)?,
),
_ => return None,
};

if pattern.is_empty() {
// For some expressions `RegExp()` and `RegExp("")`
// Theoretically we can use `/(?:)/` to achieve shorter code
// But some browsers released in 2015 don't support them yet.
args[0].expr = pattern.into();
return None;
}

let flags = args
.get_mut(1)
.map(|v| v.expr.take())
.map(|v| match *v {
Expr::Lit(Lit::Str(s)) => {
assert!(s.value.is_ascii());

let s = s.value.to_string();
let mut bytes = s.into_bytes();
bytes.sort_unstable();

String::from_utf8(bytes).unwrap().into()
}
_ => {
unreachable!()
}
})
.unwrap_or_default();

report_change!("Optimized regex");

Some(Expr::Lit(Lit::Regex(Regex {
span: *span,
exp: pattern.into(),
flags,
flags: {
let flag = flag.to_string();
let mut bytes = flag.into_bytes();
bytes.sort_unstable();

String::from_utf8(bytes).unwrap().into()
},
})))
}

Expand Down
@@ -1,4 +1,4 @@
bar(RegExp(""));
bar(RegExp("", "u"));
bar(/a/);
bar(/a/u);
bar(RegExp("a", "u"));
Expand Up @@ -2,4 +2,4 @@
/bar/gi;
RegExp(foo);
RegExp("bar", ig);
/should/afil;
RegExp("should", "fail");

1 comment on commit 1318afe

@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: 1318afe Previous: 34f9ad3 Ratio
es/full/bugs-1 306623 ns/iter (± 11631) 308512 ns/iter (± 16467) 0.99
es/full/minify/libraries/antd 1638608675 ns/iter (± 21909079) 1698889544 ns/iter (± 47815608) 0.96
es/full/minify/libraries/d3 289195906 ns/iter (± 10648115) 299333971 ns/iter (± 6510919) 0.97
es/full/minify/libraries/echarts 1241589547 ns/iter (± 10768243) 1294526287 ns/iter (± 6372761) 0.96
es/full/minify/libraries/jquery 89922862 ns/iter (± 570943) 91782327 ns/iter (± 620736) 0.98
es/full/minify/libraries/lodash 106286057 ns/iter (± 1058628) 107124435 ns/iter (± 908734) 0.99
es/full/minify/libraries/moment 51916926 ns/iter (± 383381) 53586749 ns/iter (± 392695) 0.97
es/full/minify/libraries/react 19059611 ns/iter (± 88890) 19328083 ns/iter (± 216182) 0.99
es/full/minify/libraries/terser 240904371 ns/iter (± 3288501) 250846627 ns/iter (± 2110540) 0.96
es/full/minify/libraries/three 431118030 ns/iter (± 2848130) 454585088 ns/iter (± 2705487) 0.95
es/full/minify/libraries/typescript 3130041728 ns/iter (± 26289235) 3183843026 ns/iter (± 16713740) 0.98
es/full/minify/libraries/victory 655384265 ns/iter (± 8368443) 691745115 ns/iter (± 10438722) 0.95
es/full/minify/libraries/vue 128664545 ns/iter (± 1034484) 131947705 ns/iter (± 791050) 0.98
es/full/codegen/es3 25712 ns/iter (± 180) 25933 ns/iter (± 95) 0.99
es/full/codegen/es5 26044 ns/iter (± 76) 25928 ns/iter (± 67) 1.00
es/full/codegen/es2015 25776 ns/iter (± 116) 25918 ns/iter (± 91) 0.99
es/full/codegen/es2016 25618 ns/iter (± 114) 25906 ns/iter (± 83) 0.99
es/full/codegen/es2017 25658 ns/iter (± 111) 25950 ns/iter (± 49) 0.99
es/full/codegen/es2018 26111 ns/iter (± 174) 25882 ns/iter (± 71) 1.01
es/full/codegen/es2019 26294 ns/iter (± 86) 25925 ns/iter (± 69) 1.01
es/full/codegen/es2020 26219 ns/iter (± 71) 25970 ns/iter (± 61) 1.01
es/full/all/es3 172236773 ns/iter (± 2787063) 172096916 ns/iter (± 2410540) 1.00
es/full/all/es5 164580444 ns/iter (± 2534544) 162634617 ns/iter (± 3688496) 1.01
es/full/all/es2015 125573663 ns/iter (± 1951023) 127293594 ns/iter (± 1940186) 0.99
es/full/all/es2016 125142746 ns/iter (± 2364566) 124362984 ns/iter (± 1249527) 1.01
es/full/all/es2017 123687102 ns/iter (± 961224) 123603167 ns/iter (± 1414451) 1.00
es/full/all/es2018 121372851 ns/iter (± 785666) 121159810 ns/iter (± 998187) 1.00
es/full/all/es2019 119369526 ns/iter (± 560845) 120695835 ns/iter (± 871178) 0.99
es/full/all/es2020 114985316 ns/iter (± 853334) 115004404 ns/iter (± 1481342) 1.00
es/full/parser 538738 ns/iter (± 8837) 544741 ns/iter (± 7707) 0.99
es/full/base/fixer 22016 ns/iter (± 44) 21943 ns/iter (± 36) 1.00
es/full/base/resolver_and_hygiene 80905 ns/iter (± 344) 81178 ns/iter (± 96) 1.00
serialization of ast node 143 ns/iter (± 1) 144 ns/iter (± 0) 0.99
serialization of serde 132 ns/iter (± 0) 134 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 27523456 ns/iter (± 113597) 28559366 ns/iter (± 139487) 0.96
css/visitor/compare/clone 2054303 ns/iter (± 13423) 2062789 ns/iter (± 22041) 1.00
css/visitor/compare/visit_mut_span 2241906 ns/iter (± 5767) 2241179 ns/iter (± 5228) 1.00
css/visitor/compare/visit_mut_span_panic 2304037 ns/iter (± 37748) 2337288 ns/iter (± 4783) 0.99
css/visitor/compare/fold_span 3006363 ns/iter (± 21519) 3055345 ns/iter (± 17080) 0.98
css/visitor/compare/fold_span_panic 3105584 ns/iter (± 20907) 3211476 ns/iter (± 22719) 0.97
css/lexer/bootstrap_5_1_3 5114115 ns/iter (± 45331) 5190110 ns/iter (± 40728) 0.99
css/lexer/foundation_6_7_4 4298407 ns/iter (± 11536) 4367995 ns/iter (± 1250) 0.98
css/lexer/tailwind_3_1_1 817917 ns/iter (± 6016) 830767 ns/iter (± 346) 0.98
css/parser/bootstrap_5_1_3 21198577 ns/iter (± 107422) 21648849 ns/iter (± 42791) 0.98
css/parser/foundation_6_7_4 16968142 ns/iter (± 129154) 17369467 ns/iter (± 149930) 0.98
css/parser/tailwind_3_1_1 3269098 ns/iter (± 25905) 3322294 ns/iter (± 6170) 0.98
es/codegen/colors 334090 ns/iter (± 189034) 327453 ns/iter (± 184398) 1.02
es/codegen/large 1220180 ns/iter (± 620932) 1233084 ns/iter (± 647532) 0.99
es/codegen/with-parser/colors 47061 ns/iter (± 477) 47908 ns/iter (± 306) 0.98
es/codegen/with-parser/large 514841 ns/iter (± 2797) 522545 ns/iter (± 1360) 0.99
es/minify/libraries/antd 1459294261 ns/iter (± 21997822) 1584220496 ns/iter (± 36704098) 0.92
es/minify/libraries/d3 249811570 ns/iter (± 1969325) 268325926 ns/iter (± 6003704) 0.93
es/minify/libraries/echarts 1067928249 ns/iter (± 8429624) 1141545573 ns/iter (± 41306503) 0.94
es/minify/libraries/jquery 78658774 ns/iter (± 326003) 80412533 ns/iter (± 519972) 0.98
es/minify/libraries/lodash 95227304 ns/iter (± 1243134) 96066467 ns/iter (± 820916) 0.99
es/minify/libraries/moment 45855746 ns/iter (± 423403) 46344112 ns/iter (± 290693) 0.99
es/minify/libraries/react 17156751 ns/iter (± 83590) 17478601 ns/iter (± 158497) 0.98
es/minify/libraries/terser 207300249 ns/iter (± 1503271) 211989427 ns/iter (± 2547002) 0.98
es/minify/libraries/three 359135378 ns/iter (± 3046387) 386852435 ns/iter (± 10518837) 0.93
es/minify/libraries/typescript 2693183661 ns/iter (± 13237368) 2759088285 ns/iter (± 19310311) 0.98
es/minify/libraries/victory 554536360 ns/iter (± 7315873) 603213959 ns/iter (± 13758514) 0.92
es/minify/libraries/vue 116004541 ns/iter (± 1169784) 118669053 ns/iter (± 1213202) 0.98
es/visitor/compare/clone 2377260 ns/iter (± 9655) 2367455 ns/iter (± 15554) 1.00
es/visitor/compare/visit_mut_span 2731263 ns/iter (± 12467) 2775392 ns/iter (± 11935) 0.98
es/visitor/compare/visit_mut_span_panic 2778131 ns/iter (± 9659) 2808677 ns/iter (± 8473) 0.99
es/visitor/compare/fold_span 3843085 ns/iter (± 25363) 3915282 ns/iter (± 9738) 0.98
es/visitor/compare/fold_span_panic 3965303 ns/iter (± 22039) 4069358 ns/iter (± 6456) 0.97
es/lexer/colors 15873 ns/iter (± 84) 16293 ns/iter (± 9) 0.97
es/lexer/angular 7679320 ns/iter (± 33044) 7837291 ns/iter (± 10852) 0.98
es/lexer/backbone 984615 ns/iter (± 3539) 1008471 ns/iter (± 437) 0.98
es/lexer/jquery 5480618 ns/iter (± 19211) 5603377 ns/iter (± 3521) 0.98
es/lexer/jquery mobile 8403405 ns/iter (± 47252) 8628674 ns/iter (± 14759) 0.97
es/lexer/mootools 4318290 ns/iter (± 26486) 4419170 ns/iter (± 4227) 0.98
es/lexer/underscore 821620 ns/iter (± 7006) 847354 ns/iter (± 595) 0.97
es/lexer/three 25683874 ns/iter (± 149592) 26114967 ns/iter (± 21737) 0.98
es/lexer/yui 4682680 ns/iter (± 18286) 4808084 ns/iter (± 2131) 0.97
es/parser/colors 29971 ns/iter (± 169) 30605 ns/iter (± 52) 0.98
es/parser/angular 15363694 ns/iter (± 113564) 15906574 ns/iter (± 221987) 0.97
es/parser/backbone 2236527 ns/iter (± 13170) 2296129 ns/iter (± 14288) 0.97
es/parser/jquery 12047238 ns/iter (± 60318) 12428305 ns/iter (± 58640) 0.97
es/parser/jquery mobile 18746576 ns/iter (± 196817) 19837722 ns/iter (± 403291) 0.94
es/parser/mootools 9251061 ns/iter (± 38197) 9498688 ns/iter (± 27105) 0.97
es/parser/underscore 1900729 ns/iter (± 17271) 1948748 ns/iter (± 14028) 0.98
es/parser/three 55091860 ns/iter (± 765119) 58864421 ns/iter (± 414255) 0.94
es/parser/yui 9308875 ns/iter (± 67560) 9550234 ns/iter (± 48865) 0.97
es/preset-env/usage/builtin_type 150654 ns/iter (± 34272) 143510 ns/iter (± 33705) 1.05
es/preset-env/usage/property 20716 ns/iter (± 121) 21065 ns/iter (± 97) 0.98
es/resolver/typescript 120981493 ns/iter (± 2239173) 126740377 ns/iter (± 3268328) 0.95
es/fixer/typescript 93800788 ns/iter (± 1409206) 98060722 ns/iter (± 1654646) 0.96
es/hygiene/typescript 196841859 ns/iter (± 1239643) 206197040 ns/iter (± 1472388) 0.95
es/resolver_with_hygiene/typescript 326753982 ns/iter (± 1658531) 343357500 ns/iter (± 1832561) 0.95
es/visitor/base-perf/module_clone 75010 ns/iter (± 2151) 76554 ns/iter (± 1800) 0.98
es/visitor/base-perf/fold_empty 84242 ns/iter (± 1749) 86241 ns/iter (± 812) 0.98
es/visitor/base-perf/fold_noop_impl_all 85766 ns/iter (± 2174) 86620 ns/iter (± 1593) 0.99
es/visitor/base-perf/fold_noop_impl_vec 85056 ns/iter (± 1143) 86852 ns/iter (± 1787) 0.98
es/visitor/base-perf/boxing_boxed_clone 54 ns/iter (± 0) 56 ns/iter (± 0) 0.96
es/visitor/base-perf/boxing_unboxed_clone 58 ns/iter (± 0) 59 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_boxed 100 ns/iter (± 0) 103 ns/iter (± 0) 0.97
es/visitor/base-perf/boxing_unboxed 101 ns/iter (± 0) 102 ns/iter (± 0) 0.99
es/visitor/base-perf/visit_contains_this 3492 ns/iter (± 62) 3410 ns/iter (± 39) 1.02
es/base/parallel/resolver/typescript 5398868439 ns/iter (± 556093230) 5699382005 ns/iter (± 445201509) 0.95
es/base/parallel/hygiene/typescript 2372514527 ns/iter (± 20716514) 2384874644 ns/iter (± 34197988) 0.99
misc/visitors/time-complexity/time 5 100 ns/iter (± 0) 101 ns/iter (± 0) 0.99
misc/visitors/time-complexity/time 10 327 ns/iter (± 4) 335 ns/iter (± 2) 0.98
misc/visitors/time-complexity/time 15 632 ns/iter (± 3) 643 ns/iter (± 0) 0.98
misc/visitors/time-complexity/time 20 1190 ns/iter (± 4) 1205 ns/iter (± 0) 0.99
misc/visitors/time-complexity/time 40 6550 ns/iter (± 110) 6567 ns/iter (± 1) 1.00
misc/visitors/time-complexity/time 60 16597 ns/iter (± 53) 17340 ns/iter (± 56) 0.96
es/full-target/es2016 184297 ns/iter (± 1590) 187686 ns/iter (± 385) 0.98
es/full-target/es2017 178344 ns/iter (± 663) 182499 ns/iter (± 359) 0.98
es/full-target/es2018 168179 ns/iter (± 770) 172019 ns/iter (± 364) 0.98
es2020_nullish_coalescing 65034 ns/iter (± 254) 66903 ns/iter (± 106) 0.97
es2020_optional_chaining 94039 ns/iter (± 1014) 95651 ns/iter (± 198) 0.98
es2022_class_properties 91288 ns/iter (± 350) 93966 ns/iter (± 159) 0.97
es2018_object_rest_spread 69608 ns/iter (± 301) 71360 ns/iter (± 141) 0.98
es2019_optional_catch_binding 59838 ns/iter (± 501) 61036 ns/iter (± 103) 0.98
es2017_async_to_generator 59951 ns/iter (± 294) 61272 ns/iter (± 82) 0.98
es2016_exponentiation 63523 ns/iter (± 276) 64885 ns/iter (± 175) 0.98
es2015_arrow 68984 ns/iter (± 362) 69868 ns/iter (± 198) 0.99
es2015_block_scoped_fn 64584 ns/iter (± 329) 66110 ns/iter (± 134) 0.98
es2015_block_scoping 146137 ns/iter (± 9885) 138655 ns/iter (± 10559) 1.05
es2015_classes 114574 ns/iter (± 982) 116819 ns/iter (± 354) 0.98
es2015_computed_props 59795 ns/iter (± 202) 60862 ns/iter (± 105) 0.98
es2015_destructuring 113484 ns/iter (± 855) 116801 ns/iter (± 317) 0.97
es2015_duplicate_keys 61766 ns/iter (± 383) 63464 ns/iter (± 98) 0.97
es2015_parameters 77848 ns/iter (± 626) 79549 ns/iter (± 91) 0.98
es2015_fn_name 64488 ns/iter (± 601) 65914 ns/iter (± 461) 0.98
es2015_for_of 62307 ns/iter (± 261) 63693 ns/iter (± 102) 0.98
es2015_instanceof 61529 ns/iter (± 243) 63205 ns/iter (± 81) 0.97
es2015_shorthand_property 59400 ns/iter (± 290) 60875 ns/iter (± 102) 0.98
es2015_spread 59611 ns/iter (± 226) 60817 ns/iter (± 110) 0.98
es2015_sticky_regex 60896 ns/iter (± 355) 61901 ns/iter (± 100) 0.98
es2015_typeof_symbol 60823 ns/iter (± 395) 61862 ns/iter (± 119) 0.98
es/transform/baseline/base 50471 ns/iter (± 316) 51602 ns/iter (± 89) 0.98
es/transform/baseline/common_reserved_word 61191 ns/iter (± 391) 62424 ns/iter (± 62) 0.98
es/transform/baseline/common_typescript 139462 ns/iter (± 2301) 146267 ns/iter (± 6844) 0.95
es/target/es3 165642 ns/iter (± 574) 168800 ns/iter (± 310) 0.98
es/target/es2015 615039 ns/iter (± 3193) 630689 ns/iter (± 1246) 0.98
es/target/es2016 63187 ns/iter (± 321) 65071 ns/iter (± 146) 0.97
es/target/es2017 60409 ns/iter (± 338) 61590 ns/iter (± 95) 0.98
es/target/es2018 79375 ns/iter (± 359) 81190 ns/iter (± 155) 0.98
es/target/es2020 129891 ns/iter (± 1431) 133573 ns/iter (± 225) 0.97
babelify-only 666566 ns/iter (± 4757) 672149 ns/iter (± 2947) 0.99
parse_and_babelify_angular 44399236 ns/iter (± 1551092) 43635241 ns/iter (± 768030) 1.02
parse_and_babelify_backbone 5406443 ns/iter (± 51944) 5433333 ns/iter (± 48175) 1.00
parse_and_babelify_jquery 31811105 ns/iter (± 378589) 31879412 ns/iter (± 371668) 1.00
parse_and_babelify_jquery_mobile 53955900 ns/iter (± 543758) 54801296 ns/iter (± 907102) 0.98
parse_and_babelify_mootools 32559543 ns/iter (± 420308) 33711719 ns/iter (± 535098) 0.97
parse_and_babelify_underscore 4370569 ns/iter (± 24451) 4380415 ns/iter (± 18023) 1.00
parse_and_babelify_yui 31992824 ns/iter (± 590817) 33790605 ns/iter (± 1164240) 0.95
html/minify/document/css_spec 41096955 ns/iter (± 265723) 41781665 ns/iter (± 229039) 0.98
html/minify/document/github 17072498 ns/iter (± 108565) 17567649 ns/iter (± 21973) 0.97
html/minify/document/stackoverflow 15456247 ns/iter (± 99794) 15812270 ns/iter (± 19721) 0.98
html/minify/document_fragment/css_spec 38964693 ns/iter (± 285521) 39797378 ns/iter (± 194123) 0.98
html/minify/document_fragment/github 16439108 ns/iter (± 118583) 16809864 ns/iter (± 22805) 0.98
html/minify/document_fragment/stackoverflow 14990990 ns/iter (± 218337) 15301310 ns/iter (± 17921) 0.98
html/document/visitor/compare/clone 336506 ns/iter (± 3967) 337734 ns/iter (± 2252) 1.00
html/document/visitor/compare/visit_mut_span 353405 ns/iter (± 2543) 366220 ns/iter (± 1790) 0.97
html/document/visitor/compare/visit_mut_span_panic 369534 ns/iter (± 2736) 375962 ns/iter (± 1369) 0.98
html/document/visitor/compare/fold_span 395575 ns/iter (± 2503) 403090 ns/iter (± 2090) 0.98
html/document/visitor/compare/fold_span_panic 453371 ns/iter (± 3350) 460241 ns/iter (± 1948) 0.99
html/document_fragment/visitor/compare/clone 329706 ns/iter (± 2954) 332370 ns/iter (± 1540) 0.99
html/document_fragment/visitor/compare/visit_mut_span 362759 ns/iter (± 2601) 365473 ns/iter (± 2213) 0.99
html/document_fragment/visitor/compare/visit_mut_span_panic 372985 ns/iter (± 3349) 374530 ns/iter (± 1356) 1.00
html/document_fragment/visitor/compare/fold_span 396244 ns/iter (± 1965) 403198 ns/iter (± 2063) 0.98
html/document_fragment/visitor/compare/fold_span_panic 451818 ns/iter (± 3859) 462535 ns/iter (± 965) 0.98
html/lexer/css_2021_spec 15213265 ns/iter (± 126788) 15523506 ns/iter (± 20604) 0.98
html/lexer/github_com_17_05_2022 5890318 ns/iter (± 22596) 6023180 ns/iter (± 3784) 0.98
html/lexer/stackoverflow_com_17_05_2022 5505420 ns/iter (± 29460) 5629210 ns/iter (± 4048) 0.98
html/parser/parser_document/css_2021_spec 25002613 ns/iter (± 232460) 25567545 ns/iter (± 275362) 0.98
html/parser/parser_document/github_com_17_05_2022 8511434 ns/iter (± 30740) 8737190 ns/iter (± 15296) 0.97
html/parser/parser_document/stackoverflow_com_17_05_2022 7507888 ns/iter (± 24117) 7687277 ns/iter (± 15318) 0.98
html/parser/parser_document_fragment/css_2021_spec 24962807 ns/iter (± 163821) 25494844 ns/iter (± 152034) 0.98
html/parser/parser_document_fragment/github_com_17_05_2022 8555079 ns/iter (± 33360) 8755638 ns/iter (± 12359) 0.98
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7536663 ns/iter (± 40898) 7702084 ns/iter (± 10420) 0.98

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

Please sign in to comment.