Skip to content

Commit

Permalink
fix(es/minifier): Remove wrong optimization of new RegExp(…) (#7091)
Browse files Browse the repository at this point in the history
  • Loading branch information
andersk committed Mar 17, 2023
1 parent 8902741 commit 493a4f7
Show file tree
Hide file tree
Showing 17 changed files with 81 additions and 42 deletions.
45 changes: 42 additions & 3 deletions crates/swc_ecma_minifier/src/compress/pure/misc.rs
Expand Up @@ -16,6 +16,46 @@ use crate::compress::{
pure::strings::{convert_str_value_to_tpl_cooked, convert_str_value_to_tpl_raw},
util::is_pure_undefined,
};

fn is_definitely_string(expr: &Expr) -> bool {
match expr {
Expr::Lit(Lit::Str(_)) => true,
Expr::Tpl(_) => true,
Expr::Bin(BinExpr {
op: BinaryOp::Add,
left,
right,
..
}) => is_definitely_string(left) || is_definitely_string(right),
Expr::Paren(ParenExpr { expr, .. }) => is_definitely_string(expr),
_ => false,
}
}

/// Check whether we can compress `new RegExp(…)` to `RegExp(…)`. That's sound
/// unless the first argument is already a RegExp object and the second is
/// undefined. We check for the common case where we can prove one of the first
/// two arguments is a string.
fn can_compress_new_regexp(args: Option<&[ExprOrSpread]>) -> bool {
if let Some(args) = args {
if let Some(first) = args.first() {
if first.spread.is_some() {
false
} else if is_definitely_string(&first.expr) {
true
} else if let Some(second) = args.get(1) {
second.spread.is_none() && is_definitely_string(&second.expr)
} else {
false
}
} else {
true
}
} else {
true
}
}

impl Pure<'_> {
pub(super) fn remove_invalid(&mut self, e: &mut Expr) {
match e {
Expand Down Expand Up @@ -555,8 +595,6 @@ impl Pure<'_> {
"Array",
// https://262.ecma-international.org/12.0/#sec-function-constructor
"Function",
// https://262.ecma-international.org/12.0/#sec-regexp-constructor
"RegExp",
// https://262.ecma-international.org/12.0/#sec-error-constructor
"Error",
// https://262.ecma-international.org/12.0/#sec-aggregate-error-constructor
Expand All @@ -569,7 +607,8 @@ impl Pure<'_> {
"TypeError",
"URIError",
],
) =>
) || (callee.is_global_ref_to(&self.expr_ctx, "RegExp")
&& can_compress_new_regexp(args.as_deref())) =>
{
self.changed = true;
report_change!(
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_minifier/tests/benches-full/echarts.js
Expand Up @@ -40811,7 +40811,7 @@
'<>': 'ne'
}, RegExpEvaluator = function() {
function RegExpEvaluator(rVal) {
null == (this._condVal = isString(rVal) ? RegExp(rVal) : isRegExp(rVal) ? rVal : null) && throwError(makePrintable('Illegal regexp', rVal, 'in'));
null == (this._condVal = isString(rVal) ? new RegExp(rVal) : isRegExp(rVal) ? rVal : null) && throwError(makePrintable('Illegal regexp', rVal, 'in'));
}
return RegExpEvaluator.prototype.evaluate = function(lVal) {
var type = typeof lVal;
Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_minifier/tests/benches-full/jquery.js
Expand Up @@ -153,7 +153,7 @@
}, hasOwn = {}.hasOwnProperty, arr = [], pop = arr.pop, pushNative = arr.push, push = arr.push, slice = arr.slice, indexOf = function(list, elem) {
for(var i = 0, len = list.length; i < len; i++)if (list[i] === elem) return i;
return -1;
}, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", whitespace = "[\\x20\\t\\r\\n\\f]", identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + "*([*^$|!~]?=)" + whitespace + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|.*)\\)|)", rwhitespace = RegExp(whitespace + "+", "g"), rtrim = RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), rcomma = RegExp("^" + whitespace + "*," + whitespace + "*"), rcombinators = RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), rdescend = RegExp(whitespace + "|>"), rpseudo = RegExp(pseudos), ridentifier = RegExp("^" + identifier + "$"), matchExpr = {
}, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", whitespace = "[\\x20\\t\\r\\n\\f]", identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + "*([*^$|!~]?=)" + whitespace + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|.*)\\)|)", rwhitespace = RegExp(whitespace + "+", "g"), rtrim = RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), rcomma = RegExp("^" + whitespace + "*," + whitespace + "*"), rcombinators = RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), rdescend = RegExp(whitespace + "|>"), rpseudo = new RegExp(pseudos), ridentifier = RegExp("^" + identifier + "$"), matchExpr = {
ID: RegExp("^#(" + identifier + ")"),
CLASS: RegExp("^\\.(" + identifier + ")"),
TAG: RegExp("^(" + identifier + "|[*])"),
Expand Down Expand Up @@ -327,7 +327,7 @@
input.setAttribute("type", "hidden"), el.appendChild(input).setAttribute("name", "D"), el.querySelectorAll("[name=d]").length && rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="), 2 !== el.querySelectorAll(":enabled").length && rbuggyQSA.push(":enabled", ":disabled"), docElem.appendChild(el).disabled = !0, 2 !== el.querySelectorAll(":disabled").length && rbuggyQSA.push(":enabled", ":disabled"), el.querySelectorAll("*,:x"), rbuggyQSA.push(",.*:");
})), (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) && assert(function(el) {
support.disconnectedMatch = matches.call(el, "*"), matches.call(el, "[s!='']:x"), rbuggyMatches.push("!=", pseudos);
}), rbuggyQSA = rbuggyQSA.length && RegExp(rbuggyQSA.join("|")), rbuggyMatches = rbuggyMatches.length && RegExp(rbuggyMatches.join("|")), contains = (hasCompare = rnative.test(docElem.compareDocumentPosition)) || rnative.test(docElem.contains) ? function(a, b) {
}), rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")), rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")), contains = (hasCompare = rnative.test(docElem.compareDocumentPosition)) || rnative.test(docElem.contains) ? function(a, b) {
var adown = 9 === a.nodeType ? a.documentElement : a, bup = b && b.parentNode;
return a === bup || !!(bup && 1 === bup.nodeType && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(bup)));
} : function(a, b) {
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_minifier/tests/benches-full/moment.js
Expand Up @@ -784,7 +784,7 @@
}
config._a = [], getParsingFlags(config).empty = !0;
var locale, hour, meridiem, isPm, i, parsedInput, tokens1, token, skipped, era, string = '' + config._i, stringLength = string.length, totalParsedInputLength = 0;
for(i = 0, tokens1 = expandFormat(config._f, config._locale).match(formattingTokens) || []; i < tokens1.length; i++)(token = tokens1[i], (parsedInput = (string.match(hasOwnProp(regexes, token) ? regexes[token](config._strict, config._locale) : RegExp(regexEscape(token.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function(matched, p1, p2, p3, p4) {
for(i = 0, tokens1 = expandFormat(config._f, config._locale).match(formattingTokens) || []; i < tokens1.length; i++)(token = tokens1[i], (parsedInput = (string.match(hasOwnProp(regexes, token) ? regexes[token](config._strict, config._locale) : new RegExp(regexEscape(token.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function(matched, p1, p2, p3, p4) {
return p1 || p2 || p3 || p4;
})))) || [])[0]) && ((skipped = string.substr(0, string.indexOf(parsedInput))).length > 0 && getParsingFlags(config).unusedInput.push(skipped), string = string.slice(string.indexOf(parsedInput) + parsedInput.length), totalParsedInputLength += parsedInput.length), formatTokenFunctions[token]) ? (parsedInput ? getParsingFlags(config).empty = !1 : getParsingFlags(config).unusedTokens.push(token), null != parsedInput && hasOwnProp(tokens, token) && tokens[token](parsedInput, config._a, config, token)) : config._strict && !parsedInput && getParsingFlags(config).unusedTokens.push(token);
getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength, string.length > 0 && getParsingFlags(config).unusedInput.push(string), config._a[3] <= 12 && !0 === getParsingFlags(config).bigHour && config._a[3] > 0 && (getParsingFlags(config).bigHour = void 0), getParsingFlags(config).parsedDateParts = config._a.slice(0), getParsingFlags(config).meridiem = config._meridiem, config._a[3] = (locale = config._locale, hour = config._a[3], null == (meridiem = config._meridiem) ? hour : null != locale.meridiemHour ? locale.meridiemHour(hour, meridiem) : (null != locale.isPM && ((isPm = locale.isPM(meridiem)) && hour < 12 && (hour += 12), isPm || 12 !== hour || (hour = 0)), hour)), null !== (era = getParsingFlags(config).era) && (config._a[0] = config._locale.erasConvertYear(era, config._a[0])), configFromArray(config), checkOverflow(config);
Expand Down
10 changes: 5 additions & 5 deletions crates/swc_ecma_minifier/tests/benches-full/terser.js
Expand Up @@ -4174,7 +4174,7 @@
let comments = options.comments;
if ("string" == typeof options.comments && /^\/.*\/[a-zA-Z]*$/.test(options.comments)) {
var regex_pos = options.comments.lastIndexOf("/");
comments = RegExp(options.comments.substr(1, regex_pos - 1), options.comments.substr(regex_pos + 1));
comments = new RegExp(options.comments.substr(1, regex_pos - 1), options.comments.substr(regex_pos + 1));
}
comment_filter = comments instanceof RegExp ? function(comment) {
return "comment5" != comment.type && comments.test(comment.value);
Expand Down Expand Up @@ -8393,7 +8393,7 @@
return params.push(value), arg !== value;
})) {
let [source, flags] = params;
source = regexp_source_fix(RegExp(source).source);
source = regexp_source_fix(new RegExp(source).source);
const rx = make_node(AST_RegExp, self1, {
value: {
source,
Expand Down Expand Up @@ -17715,7 +17715,7 @@
}(reserved);
var cname = -1;
cache = options.cache ? options.cache.props : new Map();
var regex = options.regex && RegExp(options.regex), debug = !1 !== options.debug;
var regex = options.regex && new RegExp(options.regex), debug = !1 !== options.debug;
debug && (debug_name_suffix = !0 === options.debug ? "" : options.debug);
var names_to_mangle = new Set(), unmangleable = new Set();
cache.forEach((mangled_name)=>unmangleable.add(mangled_name));
Expand Down Expand Up @@ -17956,7 +17956,7 @@
}), (node)=>{
if (node instanceof AST_Assign) {
var name = node.left.print_to_string(), value = node.right;
return flag ? options[name] = value : value instanceof AST_Array ? options[name] = value.elements.map(to_string) : value instanceof AST_RegExp ? (value = value.value, options[name] = RegExp(value.source, value.flags)) : options[name] = to_string(value), !0;
return flag ? options[name] = value : value instanceof AST_Array ? options[name] = value.elements.map(to_string) : value instanceof AST_RegExp ? (value = value.value, options[name] = new RegExp(value.source, value.flags)) : options[name] = to_string(value), !0;
}
if (node instanceof AST_Symbol || node instanceof AST_PropAccess) {
var name = node.print_to_string();
Expand Down Expand Up @@ -18003,7 +18003,7 @@
var entries = fs.readdirSync(dir);
} catch (ex) {}
if (entries) {
var rx = RegExp("^" + path.basename(glob).replace(/[.+^$[\]\\(){}]/g, "\\$&").replace(/\*/g, "[^/\\\\]*").replace(/\?/g, "[^/\\\\]") + "$", "win32" === process.platform ? "i" : ""), results = entries.filter(function(name) {
var pattern = "^" + path.basename(glob).replace(/[.+^$[\]\\(){}]/g, "\\$&").replace(/\*/g, "[^/\\\\]*").replace(/\?/g, "[^/\\\\]") + "$", mod = "win32" === process.platform ? "i" : "", rx = new RegExp(pattern, mod), results = entries.filter(function(name) {
return rx.test(name);
}).map(function(name) {
return path.join(dir, name);
Expand Down
Expand Up @@ -7324,7 +7324,7 @@
return [
function(regexp) {
var O = requireObjectCoercible(this), matcher = void 0 == regexp ? void 0 : getMethod(regexp, MATCH);
return matcher ? matcher.call(regexp, O) : RegExp(regexp)[MATCH](toString1(O));
return matcher ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString1(O));
},
function(string) {
var result, rx = anObject(this), S = toString1(string), res = maybeCallNative(nativeMatch, rx, S);
Expand Down Expand Up @@ -7468,7 +7468,7 @@
return [
function(regexp) {
var O = requireObjectCoercible(this), searcher = void 0 == regexp ? void 0 : getMethod(regexp, SEARCH);
return searcher ? searcher.call(regexp, O) : RegExp(regexp)[SEARCH](toString1(O));
return searcher ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](toString1(O));
},
function(string) {
var rx = anObject(this), S = toString1(string), res = maybeCallNative(nativeSearch, rx, S);
Expand Down
Expand Up @@ -457,7 +457,7 @@
}
}
_t.EMPTY_BYTE_STRING = new _t("");
const mt = RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);
const mt = new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);
function gt(t) {
if (t || L(), "string" == typeof t) {
let e = 0;
Expand Down
Expand Up @@ -784,7 +784,7 @@
}
config._a = [], getParsingFlags(config).empty = !0;
var locale, hour, meridiem, isPm, i, parsedInput, tokens1, token, skipped, era, string = "" + config._i, stringLength = string.length, totalParsedInputLength = 0;
for(i = 0, tokens1 = expandFormat(config._f, config._locale).match(formattingTokens) || []; i < tokens1.length; i++)(token = tokens1[i], (parsedInput = (string.match(hasOwnProp(regexes, token) ? regexes[token](config._strict, config._locale) : RegExp(regexEscape(token.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function(matched, p1, p2, p3, p4) {
for(i = 0, tokens1 = expandFormat(config._f, config._locale).match(formattingTokens) || []; i < tokens1.length; i++)(token = tokens1[i], (parsedInput = (string.match(hasOwnProp(regexes, token) ? regexes[token](config._strict, config._locale) : new RegExp(regexEscape(token.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function(matched, p1, p2, p3, p4) {
return p1 || p2 || p3 || p4;
})))) || [])[0]) && ((skipped = string.substr(0, string.indexOf(parsedInput))).length > 0 && getParsingFlags(config).unusedInput.push(skipped), string = string.slice(string.indexOf(parsedInput) + parsedInput.length), totalParsedInputLength += parsedInput.length), formatTokenFunctions[token]) ? (parsedInput ? getParsingFlags(config).empty = !1 : getParsingFlags(config).unusedTokens.push(token), null != parsedInput && hasOwnProp(tokens, token) && tokens[token](parsedInput, config._a, config, token)) : config._strict && !parsedInput && getParsingFlags(config).unusedTokens.push(token);
getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength, string.length > 0 && getParsingFlags(config).unusedInput.push(string), config._a[3] <= 12 && !0 === getParsingFlags(config).bigHour && config._a[3] > 0 && (getParsingFlags(config).bigHour = void 0), getParsingFlags(config).parsedDateParts = config._a.slice(0), getParsingFlags(config).meridiem = config._meridiem, config._a[3] = (locale = config._locale, hour = config._a[3], null == (meridiem = config._meridiem) ? hour : null != locale.meridiemHour ? locale.meridiemHour(hour, meridiem) : (null != locale.isPM && ((isPm = locale.isPM(meridiem)) && hour < 12 && (hour += 12), isPm || 12 !== hour || (hour = 0)), hour)), null !== (era = getParsingFlags(config).era) && (config._a[0] = config._locale.erasConvertYear(era, config._a[0])), configFromArray(config), checkOverflow(config);
Expand Down
Expand Up @@ -524,7 +524,7 @@
yellow: "#ffff00",
yellowgreen: "#9acd32"
}, CSS_UNIT = "(?:".concat("[-\\+]?\\d*\\.\\d+%?", ")|(?:").concat("[-\\+]?\\d+%?", ")"), PERMISSIVE_MATCH3 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?"), PERMISSIVE_MATCH4 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?"), matchers = {
CSS_UNIT: RegExp(CSS_UNIT),
CSS_UNIT: new RegExp(CSS_UNIT),
rgb: RegExp("rgb" + PERMISSIVE_MATCH3),
rgba: RegExp("rgba" + PERMISSIVE_MATCH4),
hsl: RegExp("hsl" + PERMISSIVE_MATCH3),
Expand Down

1 comment on commit 493a4f7

@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: 493a4f7 Previous: 8353acc Ratio
es/full/bugs-1 327551 ns/iter (± 14225) 301885 ns/iter (± 9353) 1.09
es/full/minify/libraries/antd 1715522347 ns/iter (± 60606046) 1580029707 ns/iter (± 26306516) 1.09
es/full/minify/libraries/d3 338790927 ns/iter (± 15295068) 295003711 ns/iter (± 6418871) 1.15
es/full/minify/libraries/echarts 1285622014 ns/iter (± 31497793) 1203909233 ns/iter (± 10842554) 1.07
es/full/minify/libraries/jquery 95951022 ns/iter (± 2631591) 89260421 ns/iter (± 1258964) 1.07
es/full/minify/libraries/lodash 110474521 ns/iter (± 3319031) 103745469 ns/iter (± 956442) 1.06
es/full/minify/libraries/moment 55146388 ns/iter (± 1055488) 51730490 ns/iter (± 254780) 1.07
es/full/minify/libraries/react 20436088 ns/iter (± 528286) 18835248 ns/iter (± 187306) 1.08
es/full/minify/libraries/terser 265853458 ns/iter (± 8240809) 238830515 ns/iter (± 2562555) 1.11
es/full/minify/libraries/three 476921168 ns/iter (± 13199875) 422688847 ns/iter (± 10589092) 1.13
es/full/minify/libraries/typescript 3169640697 ns/iter (± 47432772) 3035628227 ns/iter (± 21104614) 1.04
es/full/minify/libraries/victory 734681824 ns/iter (± 17188689) 628884404 ns/iter (± 16289999) 1.17
es/full/minify/libraries/vue 139953054 ns/iter (± 3577865) 125398182 ns/iter (± 1592252) 1.12
es/full/codegen/es3 27310 ns/iter (± 58) 25957 ns/iter (± 211) 1.05
es/full/codegen/es5 27306 ns/iter (± 82) 26194 ns/iter (± 144) 1.04
es/full/codegen/es2015 27357 ns/iter (± 65) 26097 ns/iter (± 96) 1.05
es/full/codegen/es2016 27483 ns/iter (± 89) 26063 ns/iter (± 341) 1.05
es/full/codegen/es2017 27397 ns/iter (± 72) 26213 ns/iter (± 48) 1.05
es/full/codegen/es2018 27360 ns/iter (± 77) 26217 ns/iter (± 64) 1.04
es/full/codegen/es2019 27373 ns/iter (± 60) 26136 ns/iter (± 88) 1.05
es/full/codegen/es2020 27350 ns/iter (± 130) 26174 ns/iter (± 173) 1.04
es/full/all/es3 183157935 ns/iter (± 6671260) 181369818 ns/iter (± 2997542) 1.01
es/full/all/es5 178650225 ns/iter (± 4342617) 172063664 ns/iter (± 1569858) 1.04
es/full/all/es2015 140015284 ns/iter (± 2594129) 135501046 ns/iter (± 2127646) 1.03
es/full/all/es2016 135747368 ns/iter (± 3117324) 133506030 ns/iter (± 2052564) 1.02
es/full/all/es2017 135786508 ns/iter (± 1997966) 132849589 ns/iter (± 1817375) 1.02
es/full/all/es2018 133283504 ns/iter (± 3701879) 129185069 ns/iter (± 1053435) 1.03
es/full/all/es2019 134197746 ns/iter (± 5251094) 126418816 ns/iter (± 2187297) 1.06
es/full/all/es2020 124829582 ns/iter (± 3459330) 119529990 ns/iter (± 592356) 1.04
es/full/parser 538228 ns/iter (± 8177) 533804 ns/iter (± 7258) 1.01
es/full/base/fixer 22358 ns/iter (± 39) 22496 ns/iter (± 114) 0.99
es/full/base/resolver_and_hygiene 81437 ns/iter (± 247) 85287 ns/iter (± 167) 0.95
serialization of ast node 124 ns/iter (± 0) 127 ns/iter (± 0) 0.98
serialization of serde 126 ns/iter (± 0) 126 ns/iter (± 0) 1
css/minify/libraries/bootstrap 28687569 ns/iter (± 192112) 28114163 ns/iter (± 133257) 1.02
css/visitor/compare/clone 2063948 ns/iter (± 9258) 2043493 ns/iter (± 17075) 1.01
css/visitor/compare/visit_mut_span 2290205 ns/iter (± 20865) 2256944 ns/iter (± 14423) 1.01
css/visitor/compare/visit_mut_span_panic 2330354 ns/iter (± 8848) 2324461 ns/iter (± 11577) 1.00
css/visitor/compare/fold_span 3060277 ns/iter (± 20205) 3013226 ns/iter (± 18768) 1.02
css/visitor/compare/fold_span_panic 3231836 ns/iter (± 15882) 3153433 ns/iter (± 27465) 1.02
css/lexer/bootstrap_5_1_3 5155080 ns/iter (± 21322) 5081613 ns/iter (± 34280) 1.01
css/lexer/foundation_6_7_4 4357464 ns/iter (± 1373) 4279004 ns/iter (± 26280) 1.02
css/lexer/tailwind_3_1_1 819593 ns/iter (± 563) 812705 ns/iter (± 6921) 1.01
css/parser/bootstrap_5_1_3 21995884 ns/iter (± 165712) 21831327 ns/iter (± 99673) 1.01
css/parser/foundation_6_7_4 17504740 ns/iter (± 41244) 17398884 ns/iter (± 150955) 1.01
css/parser/tailwind_3_1_1 3352583 ns/iter (± 5977) 3343548 ns/iter (± 8792) 1.00
es/codegen/colors 329153 ns/iter (± 183797) 328649 ns/iter (± 185435) 1.00
es/codegen/large 1169900 ns/iter (± 602304) 1357959 ns/iter (± 690328) 0.86
es/codegen/with-parser/colors 47993 ns/iter (± 246) 47909 ns/iter (± 338) 1.00
es/codegen/with-parser/large 523824 ns/iter (± 854) 523867 ns/iter (± 2092) 1.00
es/minify/libraries/antd 1479288291 ns/iter (± 33187408) 1358530442 ns/iter (± 24086774) 1.09
es/minify/libraries/d3 263300696 ns/iter (± 5413737) 243857935 ns/iter (± 10111656) 1.08
es/minify/libraries/echarts 1107958419 ns/iter (± 37468395) 1028014235 ns/iter (± 17691378) 1.08
es/minify/libraries/jquery 81009340 ns/iter (± 1491631) 77109403 ns/iter (± 799809) 1.05
es/minify/libraries/lodash 97569338 ns/iter (± 2454308) 91776234 ns/iter (± 716028) 1.06
es/minify/libraries/moment 47433620 ns/iter (± 1626353) 45175180 ns/iter (± 445246) 1.05
es/minify/libraries/react 17754446 ns/iter (± 364509) 16936336 ns/iter (± 118086) 1.05
es/minify/libraries/terser 226603459 ns/iter (± 6307584) 198436495 ns/iter (± 862761) 1.14
es/minify/libraries/three 395047101 ns/iter (± 12272024) 334799394 ns/iter (± 4622935) 1.18
es/minify/libraries/typescript 2728733060 ns/iter (± 48069361) 2552884007 ns/iter (± 35856986) 1.07
es/minify/libraries/victory 583830922 ns/iter (± 15555579) 529840413 ns/iter (± 13026617) 1.10
es/minify/libraries/vue 118414390 ns/iter (± 2084700) 112278165 ns/iter (± 1200026) 1.05
es/visitor/compare/clone 2303764 ns/iter (± 38906) 2287286 ns/iter (± 21862) 1.01
es/visitor/compare/visit_mut_span 2672134 ns/iter (± 6054) 2634222 ns/iter (± 23891) 1.01
es/visitor/compare/visit_mut_span_panic 2718734 ns/iter (± 4978) 2656558 ns/iter (± 12699) 1.02
es/visitor/compare/fold_span 3822527 ns/iter (± 28531) 3727474 ns/iter (± 28488) 1.03
es/visitor/compare/fold_span_panic 3955814 ns/iter (± 6585) 3868119 ns/iter (± 23387) 1.02
es/lexer/colors 15475 ns/iter (± 18) 15118 ns/iter (± 99) 1.02
es/lexer/angular 7484803 ns/iter (± 7816) 7303065 ns/iter (± 66898) 1.02
es/lexer/backbone 996429 ns/iter (± 376) 980532 ns/iter (± 2750) 1.02
es/lexer/jquery 5607666 ns/iter (± 2748) 5515613 ns/iter (± 57894) 1.02
es/lexer/jquery mobile 8598772 ns/iter (± 2197) 8501995 ns/iter (± 45943) 1.01
es/lexer/mootools 4459015 ns/iter (± 1947) 4349929 ns/iter (± 24642) 1.03
es/lexer/underscore 839182 ns/iter (± 454) 822742 ns/iter (± 6734) 1.02
es/lexer/three 26333991 ns/iter (± 23589) 25686738 ns/iter (± 254918) 1.03
es/lexer/yui 4691144 ns/iter (± 3563) 4570664 ns/iter (± 25133) 1.03
es/parser/colors 29887 ns/iter (± 78) 29304 ns/iter (± 63) 1.02
es/parser/angular 15516314 ns/iter (± 86938) 15290180 ns/iter (± 194006) 1.01
es/parser/backbone 2240345 ns/iter (± 12689) 2229148 ns/iter (± 12707) 1.01
es/parser/jquery 12158670 ns/iter (± 97094) 12032086 ns/iter (± 84973) 1.01
es/parser/jquery mobile 19113998 ns/iter (± 239881) 18498315 ns/iter (± 195009) 1.03
es/parser/mootools 9260903 ns/iter (± 36057) 9144918 ns/iter (± 82859) 1.01
es/parser/underscore 1894115 ns/iter (± 10081) 1878618 ns/iter (± 10620) 1.01
es/parser/three 57569748 ns/iter (± 629386) 53356793 ns/iter (± 1073530) 1.08
es/parser/yui 9312082 ns/iter (± 101052) 9153563 ns/iter (± 77946) 1.02
es/preset-env/usage/builtin_type 137990 ns/iter (± 31896) 143438 ns/iter (± 34722) 0.96
es/preset-env/usage/property 21667 ns/iter (± 47) 21512 ns/iter (± 51) 1.01
es/resolver/typescript 113520621 ns/iter (± 1769092) 115773555 ns/iter (± 2203364) 0.98
es/fixer/typescript 85545436 ns/iter (± 709392) 90498882 ns/iter (± 1554402) 0.95
es/hygiene/typescript 186941724 ns/iter (± 3424231) 188101828 ns/iter (± 1919255) 0.99
es/resolver_with_hygiene/typescript 323730450 ns/iter (± 2279302) 332936964 ns/iter (± 3287909) 0.97
es/visitor/base-perf/module_clone 80230 ns/iter (± 1119) 78624 ns/iter (± 822) 1.02
es/visitor/base-perf/fold_empty 89168 ns/iter (± 1474) 89262 ns/iter (± 1186) 1.00
es/visitor/base-perf/fold_noop_impl_all 89799 ns/iter (± 1303) 89911 ns/iter (± 1349) 1.00
es/visitor/base-perf/fold_noop_impl_vec 89626 ns/iter (± 1531) 89589 ns/iter (± 1605) 1.00
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 56 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed_clone 54 ns/iter (± 0) 54 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 102 ns/iter (± 0) 104 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed 96 ns/iter (± 0) 100 ns/iter (± 0) 0.96
es/visitor/base-perf/visit_contains_this 3495 ns/iter (± 50) 3667 ns/iter (± 57) 0.95
es/base/parallel/resolver/typescript 5504636362 ns/iter (± 314006917) 5868927701 ns/iter (± 497941948) 0.94
es/base/parallel/hygiene/typescript 2199805571 ns/iter (± 30336364) 2173921603 ns/iter (± 11555993) 1.01
misc/visitors/time-complexity/time 5 91 ns/iter (± 0) 91 ns/iter (± 0) 1
misc/visitors/time-complexity/time 10 290 ns/iter (± 0) 289 ns/iter (± 0) 1.00
misc/visitors/time-complexity/time 15 611 ns/iter (± 24) 597 ns/iter (± 16) 1.02
misc/visitors/time-complexity/time 20 1131 ns/iter (± 3) 1117 ns/iter (± 23) 1.01
misc/visitors/time-complexity/time 40 6030 ns/iter (± 58) 5938 ns/iter (± 40) 1.02
misc/visitors/time-complexity/time 60 15226 ns/iter (± 123) 15274 ns/iter (± 57) 1.00
es/full-target/es2016 249407 ns/iter (± 340) 249601 ns/iter (± 528) 1.00
es/full-target/es2017 242426 ns/iter (± 433) 243242 ns/iter (± 712) 1.00
es/full-target/es2018 232147 ns/iter (± 452) 231981 ns/iter (± 355) 1.00
es2020_nullish_coalescing 91178 ns/iter (± 746) 91684 ns/iter (± 697) 0.99
es2020_optional_chaining 123139 ns/iter (± 297) 123864 ns/iter (± 470) 0.99
es2022_class_properties 147638 ns/iter (± 345) 146747 ns/iter (± 443) 1.01
es2018_object_rest_spread 95053 ns/iter (± 281) 94869 ns/iter (± 376) 1.00
es2019_optional_catch_binding 84100 ns/iter (± 203) 84384 ns/iter (± 204) 1.00
es2017_async_to_generator 84850 ns/iter (± 314) 84937 ns/iter (± 219) 1.00
es2016_exponentiation 89424 ns/iter (± 205) 89034 ns/iter (± 314) 1.00
es2015_arrow 93128 ns/iter (± 278) 93994 ns/iter (± 664) 0.99
es2015_block_scoped_fn 90761 ns/iter (± 112) 91109 ns/iter (± 356) 1.00
es2015_block_scoping 170034 ns/iter (± 485) 168730 ns/iter (± 387) 1.01

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

Please sign in to comment.