Skip to content

Commit

Permalink
feat(es/minifier): Drop unused properties (#7534)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7472.
  • Loading branch information
kdy1 committed Jul 4, 2023
1 parent cf902d3 commit 47d2edd
Show file tree
Hide file tree
Showing 41 changed files with 460 additions and 262 deletions.
7 changes: 5 additions & 2 deletions crates/swc/tests/projects.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1095,7 +1095,7 @@ function test() {

#[test]
fn issue_7513_2() {
static INPUT: &str = "const cachedTextDecoder = { ignoreBOM: true, fatal: true };";
static INPUT: &str = "export const cachedTextDecoder = { ignoreBOM: true, fatal: true };";

let cm = Lrc::<SourceMap>::default();
let c = swc::Compiler::new(cm.clone());
Expand Down Expand Up @@ -1129,7 +1129,10 @@ fn issue_7513_2() {
.unwrap();

println!("{}", output.code);
assert_eq!(output.code, "const a={ignoreBOM:!0,fatal:!0};");
assert_eq!(
output.code,
"export const cachedTextDecoder={ignoreBOM:!0,fatal:!0};"
);
}

#[testing::fixture("tests/minify/**/input.js")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
//// [/a.js]
var p = {
a: 0,
b: "hello",
x: 8
b: "hello"
};
p.a.toFixed(), p.b.substring(1), p.d;
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
//// [/a.js]
var p = {
a: 0,
b: "hello",
x: 8
b: "hello"
};
p.a.toFixed(), p.b.substring(1), p.d;
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
//// [destructuringObjectBindingPatternAndAssignment1ES5.ts]
(void 0).a1;
var tmp = {
b21: "world"
};
var tmp = {};
(void 0 === tmp ? {
b21: "string"
} : tmp).b21;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
//// [destructuringVariableDeclaration1ES5.ts]
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
var tmp = {
b11: "world"
};
var tmp = {};
(void 0 === tmp ? {
b11: "string"
} : tmp).b11;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
//// [destructuringVariableDeclaration1ES5iterable.ts]
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
var tmp = {
b11: "world"
};
var tmp = {};
(void 0 === tmp ? {
b11: "string"
} : tmp).b11;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ import { _ as _inherits } from "@swc/helpers/_/_inherits";
import { _ as _create_super } from "@swc/helpers/_/_create_super";
export var inModule = 1;
inmodule.toFixed();
var object = {
spaaace: 3
};
var object = {};
object.spaaaace, object.spaace = 12, object.fresh = 12, other.puuuce, new Date().getGMTDate(), setIntegral(function() {
return console.log("ok");
}, 500), AudioBuffin, Jimmy, Jon;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
//// [stringLiteralTypesAsTags01.ts]
var x = {
kind: "A",
a: 100
kind: "A"
};
x.kind, x.kind;
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
//// [stringLiteralTypesAsTags02.ts]
var x = {
kind: "A",
a: 100
kind: "A"
};
x.kind, x.kind;
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
//// [stringLiteralTypesAsTags03.ts]
var x = {
kind: "A",
a: 100
kind: "A"
};
x.kind, x.kind;
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ function implicitThis(n) {
return this.m + n + 12;
}
var impl = {
a: 12,
explicitVoid2: function() {
return _this.a;
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
//// [typeGuardsOnClassProperty.ts]
import { _ as _class_call_check } from "@swc/helpers/_/_class_call_check";
var o = {
prop1: "string",
prop2: !0
prop1: "string"
};
"string" == typeof o.prop1 && o.prop1.toLowerCase();
var prop1 = o.prop1;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
//// [typedefTagExtraneousProperty.js]
var y = {
bye: "no"
};
var y = {};
y.ignoreMe = "ok but just because of the index signature", y.hi = "yes";
2 changes: 2 additions & 0 deletions crates/swc_ecma_minifier/src/compress/optimize/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2877,6 +2877,8 @@ impl VisitMut for Optimizer<'_> {

self.store_var_for_prop_hoisting(var);

self.drop_unused_properties(var);

debug_assert_valid(&var.init);
}

Expand Down
73 changes: 71 additions & 2 deletions crates/swc_ecma_minifier/src/compress/optimize/unused.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
use swc_atoms::js_word;
use swc_atoms::{js_word, JsWord};
use swc_common::{util::take::Take, Span, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_usage_analyzer::util::is_global_var_with_pure_property_access;
use swc_ecma_utils::contains_ident_ref;
use swc_ecma_utils::{contains_ident_ref, ExprExt};

use super::Optimizer;
#[cfg(feature = "debug")]
Expand Down Expand Up @@ -829,4 +829,73 @@ impl Optimizer<'_> {
f.ident = None;
}
}

pub(super) fn drop_unused_properties(&mut self, v: &mut VarDeclarator) -> Option<()> {
if !self.options.hoist_props || self.ctx.is_exported {
return None;
}

let name = v.name.as_ident()?;
let obj = v.init.as_mut()?.as_mut_object()?;

let usage = self.data.vars.get(&name.to_id())?;

if usage.indexed_with_dynamic_key || usage.used_as_ref {
return None;
}

if obj.props.iter().any(|p| match p {
PropOrSpread::Spread(_) => true,
PropOrSpread::Prop(p) => match &**p {
Prop::Shorthand(_) => false,
Prop::KeyValue(p) => {
p.key.is_computed() || p.value.may_have_side_effects(&self.expr_ctx)
}
Prop::Assign(_) => true,
Prop::Getter(p) => p.key.is_computed(),
Prop::Setter(p) => p.key.is_computed(),
Prop::Method(p) => p.key.is_computed(),
},
}) {
return None;
}

let should_preserve_property = |sym: &JsWord| {
if let "toString" = &**sym {
return true;
}
!usage.accessed_props.contains_key(sym)
};
let should_preserve = |key: &PropName| match key {
PropName::Ident(k) => should_preserve_property(&k.sym),
PropName::Str(k) => should_preserve_property(&k.value),
PropName::Num(..) => true,
PropName::Computed(..) => true,
PropName::BigInt(..) => true,
};

let len = obj.props.len();
obj.props.retain(|prop| match prop {
PropOrSpread::Spread(_) => {
unreachable!()
}
PropOrSpread::Prop(p) => match &**p {
Prop::Shorthand(p) => !should_preserve_property(&p.sym),
Prop::KeyValue(p) => !should_preserve(&p.key),
Prop::Assign(..) => {
unreachable!()
}
Prop::Getter(p) => !should_preserve(&p.key),
Prop::Setter(p) => !should_preserve(&p.key),
Prop::Method(p) => !should_preserve(&p.key),
},
});

if obj.props.len() != len {
self.changed = true;
report_change!("unused: Removing unused properties");
}

None
}
}
3 changes: 2 additions & 1 deletion crates/swc_ecma_minifier/src/eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ use swc_ecma_visit::VisitMutWith;
use crate::{
compress::{compressor, pure_optimizer, PureOptimizerConfig},
mode::Mode,
option::CompressOptions,
option::{CompressOptions, TopLevelOptions},
};

pub struct Evaluator {
Expand Down Expand Up @@ -81,6 +81,7 @@ impl Evaluator {
marks,
&CompressOptions {
hoist_props: true,
top_level: Some(TopLevelOptions { functions: true }),
..Default::default()
},
&data,
Expand Down
5 changes: 5 additions & 0 deletions crates/swc_ecma_minifier/src/program_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ impl Storage for ProgramData {

e.get_mut().callee_count += var_info.callee_count;
e.get_mut().used_as_arg |= var_info.used_as_arg;
e.get_mut().used_as_ref |= var_info.used_as_ref;
e.get_mut().indexed_with_dynamic_key |= var_info.indexed_with_dynamic_key;

e.get_mut().pure_fn |= var_info.pure_fn;
Expand Down Expand Up @@ -501,6 +502,10 @@ impl VarDataLike for VarUsageInfo {
self.reassigned = true;
}

fn mark_used_as_ref(&mut self) {
self.used_as_ref = true;
}

fn add_infects_to(&mut self, other: Access) {
self.infects_to.push(other);
}
Expand Down
1 change: 0 additions & 1 deletion crates/swc_ecma_minifier/tests/TODO.txt
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,6 @@ keep_names/keep_some_classnames/input.js
keep_names/keep_some_fnames/input.js
keep_names/keep_some_fnames_reduce/input.js
keep_quoted_strict/keep_quoted_strict/input.js
logical_assignment/assign_in_conditional_part/input.js
logical_assignment/assignment_in_left_part_2/input.js
loops/drop_if_else_break_1/input.js
loops/issue_2740_3/input.js
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11055,7 +11055,6 @@
}
var kb = {
html: "http://www.w3.org/1999/xhtml",
mathml: "http://www.w3.org/1998/Math/MathML",
svg: "http://www.w3.org/2000/svg"
};
function lb(a) {
Expand Down

1 comment on commit 47d2edd

@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: 47d2edd Previous: 0a26066 Ratio
es/full/bugs-1 303754 ns/iter (± 10391) 359320 ns/iter (± 7526) 0.85
es/full/minify/libraries/antd 1479881007 ns/iter (± 15346568) 1962626415 ns/iter (± 26476019) 0.75
es/full/minify/libraries/d3 322529959 ns/iter (± 4409340) 396462371 ns/iter (± 5399578) 0.81
es/full/minify/libraries/echarts 1204757356 ns/iter (± 10909836) 1521917201 ns/iter (± 14568815) 0.79
es/full/minify/libraries/jquery 95757637 ns/iter (± 341815) 112517553 ns/iter (± 619457) 0.85
es/full/minify/libraries/lodash 113589497 ns/iter (± 270471) 135548903 ns/iter (± 1091107) 0.84
es/full/minify/libraries/moment 56007792 ns/iter (± 72668) 65184752 ns/iter (± 789444) 0.86
es/full/minify/libraries/react 20108038 ns/iter (± 63537) 23339225 ns/iter (± 285289) 0.86
es/full/minify/libraries/terser 247915709 ns/iter (± 869642) 310109399 ns/iter (± 4187405) 0.80
es/full/minify/libraries/three 436086240 ns/iter (± 1547766) 554647983 ns/iter (± 7509872) 0.79
es/full/minify/libraries/typescript 2931924068 ns/iter (± 9864819) 3722547808 ns/iter (± 18631199) 0.79
es/full/minify/libraries/victory 627334244 ns/iter (± 5979752) 853067767 ns/iter (± 15801867) 0.74
es/full/minify/libraries/vue 138210915 ns/iter (± 418795) 163910839 ns/iter (± 1708827) 0.84
es/full/codegen/es3 37219 ns/iter (± 126) 42418 ns/iter (± 93) 0.88
es/full/codegen/es5 37157 ns/iter (± 75) 42569 ns/iter (± 44) 0.87
es/full/codegen/es2015 37239 ns/iter (± 71) 42588 ns/iter (± 64) 0.87
es/full/codegen/es2016 37211 ns/iter (± 82) 42517 ns/iter (± 75) 0.88
es/full/codegen/es2017 37222 ns/iter (± 84) 42557 ns/iter (± 35) 0.87
es/full/codegen/es2018 37199 ns/iter (± 75) 42579 ns/iter (± 57) 0.87
es/full/codegen/es2019 37227 ns/iter (± 61) 42576 ns/iter (± 86) 0.87
es/full/codegen/es2020 37168 ns/iter (± 65) 42574 ns/iter (± 39) 0.87
es/full/all/es3 182539747 ns/iter (± 484497) 213421453 ns/iter (± 3048496) 0.86
es/full/all/es5 173951819 ns/iter (± 739205) 204473113 ns/iter (± 2691775) 0.85
es/full/all/es2015 131291799 ns/iter (± 782267) 160827765 ns/iter (± 2488455) 0.82
es/full/all/es2016 130798828 ns/iter (± 339249) 159978869 ns/iter (± 3368385) 0.82
es/full/all/es2017 130123731 ns/iter (± 431889) 159397199 ns/iter (± 2736224) 0.82
es/full/all/es2018 127483204 ns/iter (± 617335) 159012240 ns/iter (± 2427836) 0.80
es/full/all/es2019 126866347 ns/iter (± 684112) 156933399 ns/iter (± 1429045) 0.81
es/full/all/es2020 122577046 ns/iter (± 297779) 150797464 ns/iter (± 2808982) 0.81
es/full/parser 560809 ns/iter (± 1923) 648621 ns/iter (± 11285) 0.86
es/full/base/fixer 19056 ns/iter (± 101) 24656 ns/iter (± 29) 0.77
es/full/base/resolver_and_hygiene 92949 ns/iter (± 164) 105875 ns/iter (± 166) 0.88
serialization of serde 299 ns/iter (± 1) 271 ns/iter (± 0) 1.10
css/minify/libraries/bootstrap 30713654 ns/iter (± 46620) 36984932 ns/iter (± 293572) 0.83
css/visitor/compare/clone 1997582 ns/iter (± 16362) 2349279 ns/iter (± 13602) 0.85
css/visitor/compare/visit_mut_span 2107275 ns/iter (± 10220) 2569608 ns/iter (± 7668) 0.82
css/visitor/compare/visit_mut_span_panic 2173956 ns/iter (± 12393) 2605549 ns/iter (± 5858) 0.83
css/visitor/compare/fold_span 2914018 ns/iter (± 21923) 3323964 ns/iter (± 16675) 0.88
css/visitor/compare/fold_span_panic 3108407 ns/iter (± 12397) 3467807 ns/iter (± 14475) 0.90
css/lexer/bootstrap_5_1_3 4742696 ns/iter (± 6020) 5632706 ns/iter (± 6342) 0.84
css/lexer/foundation_6_7_4 3993202 ns/iter (± 2903) 4753566 ns/iter (± 3164) 0.84
css/lexer/tailwind_3_1_1 760201 ns/iter (± 358) 901726 ns/iter (± 861) 0.84
css/parser/bootstrap_5_1_3 20602595 ns/iter (± 26500) 24401531 ns/iter (± 107269) 0.84
css/parser/foundation_6_7_4 16638044 ns/iter (± 16721) 19429440 ns/iter (± 59904) 0.86
css/parser/tailwind_3_1_1 3215846 ns/iter (± 2884) 3714657 ns/iter (± 4330) 0.87
es/codegen/colors 735026 ns/iter (± 397377) 716760 ns/iter (± 391254) 1.03
es/codegen/large 3020228 ns/iter (± 1598131) 2925476 ns/iter (± 1523597) 1.03
es/codegen/with-parser/colors 49079 ns/iter (± 146) 57189 ns/iter (± 436) 0.86
es/codegen/with-parser/large 520284 ns/iter (± 1241) 579282 ns/iter (± 980) 0.90
es/minify/libraries/antd 1284220878 ns/iter (± 10742149) 1726015562 ns/iter (± 24612081) 0.74
es/minify/libraries/d3 278024561 ns/iter (± 514468) 345521019 ns/iter (± 3915541) 0.80
es/minify/libraries/echarts 1038700072 ns/iter (± 3413514) 1357623044 ns/iter (± 14090383) 0.77
es/minify/libraries/jquery 83463892 ns/iter (± 129712) 98822394 ns/iter (± 721675) 0.84
es/minify/libraries/lodash 102099424 ns/iter (± 192397) 124118935 ns/iter (± 1593664) 0.82
es/minify/libraries/moment 49159369 ns/iter (± 76968) 57614404 ns/iter (± 421970) 0.85
es/minify/libraries/react 17965705 ns/iter (± 25141) 20825032 ns/iter (± 126800) 0.86
es/minify/libraries/terser 212496268 ns/iter (± 273773) 262441531 ns/iter (± 4528475) 0.81
es/minify/libraries/three 367966430 ns/iter (± 578744) 467220267 ns/iter (± 12284677) 0.79
es/minify/libraries/typescript 2560079636 ns/iter (± 12260288) 3227327520 ns/iter (± 18441812) 0.79
es/minify/libraries/victory 541577843 ns/iter (± 1945704) 724835777 ns/iter (± 18985009) 0.75
es/minify/libraries/vue 123286396 ns/iter (± 187022) 146018771 ns/iter (± 639225) 0.84
es/visitor/compare/clone 2064708 ns/iter (± 5707) 2427594 ns/iter (± 7209) 0.85
es/visitor/compare/visit_mut_span 2409752 ns/iter (± 6201) 2779713 ns/iter (± 7031) 0.87
es/visitor/compare/visit_mut_span_panic 2447778 ns/iter (± 4183) 2846400 ns/iter (± 12031) 0.86
es/visitor/compare/fold_span 3476639 ns/iter (± 4927) 3929886 ns/iter (± 8079) 0.88
es/visitor/compare/fold_span_panic 3608432 ns/iter (± 31006) 4046621 ns/iter (± 34988) 0.89
es/lexer/colors 13486 ns/iter (± 49) 14825 ns/iter (± 14) 0.91
es/lexer/angular 6217117 ns/iter (± 34745) 7106592 ns/iter (± 2459) 0.87
es/lexer/backbone 821757 ns/iter (± 8094) 862037 ns/iter (± 537) 0.95
es/lexer/jquery 4625432 ns/iter (± 15669) 4834258 ns/iter (± 2293) 0.96
es/lexer/jquery mobile 7134022 ns/iter (± 27536) 7481481 ns/iter (± 7290) 0.95
es/lexer/mootools 3655228 ns/iter (± 26318) 3759891 ns/iter (± 1497) 0.97
es/lexer/underscore 679060 ns/iter (± 3700) 714178 ns/iter (± 413) 0.95
es/lexer/three 21532658 ns/iter (± 94626) 22650579 ns/iter (± 31995) 0.95
es/lexer/yui 4127484 ns/iter (± 33970) 4347547 ns/iter (± 5899) 0.95
es/parser/colors 28984 ns/iter (± 46) 32842 ns/iter (± 104) 0.88
es/parser/angular 14264801 ns/iter (± 65738) 16928946 ns/iter (± 303889) 0.84
es/parser/backbone 2149460 ns/iter (± 7200) 2380591 ns/iter (± 13612) 0.90
es/parser/jquery 11620760 ns/iter (± 57310) 13103385 ns/iter (± 94482) 0.89
es/parser/jquery mobile 17790266 ns/iter (± 56750) 20945633 ns/iter (± 497516) 0.85
es/parser/mootools 8894332 ns/iter (± 15863) 9841132 ns/iter (± 41230) 0.90
es/parser/underscore 1846588 ns/iter (± 10366) 2019735 ns/iter (± 9844) 0.91
es/parser/three 49562238 ns/iter (± 204934) 59812716 ns/iter (± 482457) 0.83
es/parser/yui 8934352 ns/iter (± 27897) 10086904 ns/iter (± 70735) 0.89
es/preset-env/usage/builtin_type 143355 ns/iter (± 33046) 149230 ns/iter (± 33929) 0.96
es/preset-env/usage/property 18679 ns/iter (± 48) 27658 ns/iter (± 100) 0.68
es/resolver/typescript 92786692 ns/iter (± 1694991) 133540508 ns/iter (± 2765706) 0.69
es/fixer/typescript 65232006 ns/iter (± 449023) 93852193 ns/iter (± 837592) 0.70
es/hygiene/typescript 142301688 ns/iter (± 729348) 211910952 ns/iter (± 2289408) 0.67
es/resolver_with_hygiene/typescript 299231918 ns/iter (± 1078766) 428215963 ns/iter (± 2473377) 0.70
es/visitor/base-perf/module_clone 61387 ns/iter (± 221) 85617 ns/iter (± 1327) 0.72
es/visitor/base-perf/fold_empty 64626 ns/iter (± 489) 95218 ns/iter (± 290) 0.68
es/visitor/base-perf/fold_noop_impl_all 65339 ns/iter (± 245) 95571 ns/iter (± 393) 0.68
es/visitor/base-perf/fold_noop_impl_vec 65270 ns/iter (± 322) 96246 ns/iter (± 513) 0.68
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 66 ns/iter (± 0) 0.86
es/visitor/base-perf/boxing_unboxed_clone 40 ns/iter (± 0) 44 ns/iter (± 0) 0.91
es/visitor/base-perf/boxing_boxed 113 ns/iter (± 0) 104 ns/iter (± 0) 1.09
es/visitor/base-perf/boxing_unboxed 80 ns/iter (± 0) 81 ns/iter (± 0) 0.99
es/visitor/base-perf/visit_empty 0 ns/iter (± 0)
es/visitor/base-perf/visit_contains_this 2670 ns/iter (± 26) 3676 ns/iter (± 91) 0.73
es/base/parallel/resolver/typescript 4459443302 ns/iter (± 232743404) 7157185144 ns/iter (± 637702958) 0.62
es/base/parallel/hygiene/typescript 1545252983 ns/iter (± 13725430) 2399244782 ns/iter (± 26914818) 0.64
misc/visitors/time-complexity/time 5 112 ns/iter (± 3) 111 ns/iter (± 0) 1.01
misc/visitors/time-complexity/time 10 263 ns/iter (± 6) 380 ns/iter (± 0) 0.69
misc/visitors/time-complexity/time 15 510 ns/iter (± 11) 756 ns/iter (± 1) 0.67
misc/visitors/time-complexity/time 20 947 ns/iter (± 10) 1421 ns/iter (± 2) 0.67
misc/visitors/time-complexity/time 40 3808 ns/iter (± 24) 7431 ns/iter (± 1) 0.51
misc/visitors/time-complexity/time 60 8288 ns/iter (± 486) 18814 ns/iter (± 16) 0.44
es/full-target/es2016 243509 ns/iter (± 774) 268993 ns/iter (± 529) 0.91
es/full-target/es2017 230548 ns/iter (± 1166) 260323 ns/iter (± 1058) 0.89
es/full-target/es2018 218155 ns/iter (± 881) 248816 ns/iter (± 558) 0.88
es2020_nullish_coalescing 73037 ns/iter (± 439) 98141 ns/iter (± 228) 0.74
es2020_optional_chaining 82929 ns/iter (± 411) 113686 ns/iter (± 368) 0.73
es2022_class_properties 123092 ns/iter (± 305) 157139 ns/iter (± 253) 0.78
es2018_object_rest_spread 76848 ns/iter (± 188) 99580 ns/iter (± 210) 0.77
es2019_optional_catch_binding 67182 ns/iter (± 244) 88577 ns/iter (± 223) 0.76
es2017_async_to_generator 65172 ns/iter (± 70) 89289 ns/iter (± 222) 0.73
es2016_exponentiation 70838 ns/iter (± 196) 95447 ns/iter (± 346) 0.74
es2015_arrow 74373 ns/iter (± 193) 98976 ns/iter (± 256) 0.75
es2015_block_scoped_fn 71758 ns/iter (± 222) 96844 ns/iter (± 226) 0.74
es2015_block_scoping 134829 ns/iter (± 531) 186168 ns/iter (± 354) 0.72

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

Please sign in to comment.