Skip to content

Commit

Permalink
fix(es/minifier): Infect mutation when assigning a property (#7503)
Browse files Browse the repository at this point in the history
  • Loading branch information
Austaras committed Jun 8, 2023
1 parent 3fe1236 commit 7f9f0b8
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 97 deletions.
122 changes: 62 additions & 60 deletions crates/swc_ecma_minifier/src/compress/optimize/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -712,85 +712,87 @@ impl Optimizer<'_> {

/// Actually inlines variables.
pub(super) fn inline(&mut self, e: &mut Expr) {
if let Expr::Member(me) = e {
if let MemberProp::Computed(ref mut prop) = me.prop {
if let Expr::Lit(Lit::Num(..)) = &*prop.expr {
if let Expr::Ident(obj) = &*me.obj {
let new = self.vars.lits_for_array_access.get(&obj.to_id());

if let Some(new) = new {
report_change!("inline: Inlined array access");
self.changed = true;

me.obj = new.clone();
// TODO(kdy1): Optimize performance by skipping visiting of children
// nodes.
e.visit_mut_with(&mut expr_simplifier(
self.marks.unresolved_mark,
Default::default(),
));
match e {
Expr::Member(me) => {
if let MemberProp::Computed(prop) = &mut me.prop {
if let Expr::Lit(Lit::Num(..)) = &*prop.expr {
if let Expr::Ident(obj) = &*me.obj {
let new = self.vars.lits_for_array_access.get(&obj.to_id());

if let Some(new) = new {
report_change!("inline: Inlined array access");
self.changed = true;

me.obj = new.clone();
// TODO(kdy1): Optimize performance by skipping visiting of children
// nodes.
e.visit_mut_with(&mut expr_simplifier(
self.marks.unresolved_mark,
Default::default(),
));
}
}
return;
}
}
}
}

if let Expr::Ident(i) = e {
let id = i.to_id();
if let Some(value) = self
.vars
.lits
.get(&id)
.or_else(|| {
if self.ctx.is_callee {
self.vars.simple_functions.get(&i.to_id())
} else {
None
}
})
.cloned()
{
if !matches!(&*value, Expr::Ident(..) | Expr::Member(..)) && self.ctx.is_update_arg
Expr::Ident(i) => {
let id = i.to_id();
if let Some(value) = self
.vars
.lits
.get(&id)
.or_else(|| {
if self.ctx.is_callee {
self.vars.simple_functions.get(&i.to_id())
} else {
None
}
})
.cloned()
{
return;
}
if !matches!(&*value, Expr::Ident(..) | Expr::Member(..))
&& self.ctx.is_update_arg
{
return;
}

self.changed = true;
report_change!("inline: Replacing a variable `{}` with cheap expression", i);
self.changed = true;
report_change!("inline: Replacing a variable `{}` with cheap expression", i);

if let Expr::Ident(i) = &*value {
if let Some(usage) = self.data.vars.get_mut(&i.to_id()) {
usage.ref_count += 1;
usage.usage_count += 1;
if let Expr::Ident(i) = &*value {
if let Some(usage) = self.data.vars.get_mut(&i.to_id()) {
usage.ref_count += 1;
usage.usage_count += 1;
}
}
}

*e = *value;
return;
}

// Check without cloning
if let Some(value) = self.vars.vars_for_inlining.get(&i.to_id()) {
if self.ctx.is_exact_lhs_of_assign && !is_valid_for_lhs(value) {
*e = *value;
return;
}

if let Expr::Member(..) = &**value {
if self.ctx.executed_multiple_time {
// Check without cloning
if let Some(value) = self.vars.vars_for_inlining.get(&i.to_id()) {
if self.ctx.is_exact_lhs_of_assign && !is_valid_for_lhs(value) {
return;
}

if let Expr::Member(..) = &**value {
if self.ctx.executed_multiple_time {
return;
}
}
}
}

if let Some(value) = self.vars.vars_for_inlining.remove(&i.to_id()) {
self.changed = true;
report_change!("inline: Replacing '{}' with an expression", i);
if let Some(value) = self.vars.vars_for_inlining.remove(&i.to_id()) {
self.changed = true;
report_change!("inline: Replacing '{}' with an expression", i);

*e = *value;
*e = *value;

log_abort!("inline: [Change] {}", crate::debug::dump(&*e, false))
log_abort!("inline: [Change] {}", crate::debug::dump(&*e, false))
}
}
_ => (),
}
}
}
Expand Down
55 changes: 28 additions & 27 deletions crates/swc_ecma_minifier/src/program_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,31 @@ impl Storage for ProgramData {
fn truncate_initialized_cnt(&mut self, len: usize) {
self.initialized_vars.truncate(len)
}

fn mark_property_mutattion(&mut self, id: Id, ctx: Ctx) {
let e = self.vars.entry(id).or_default();
e.has_property_mutation = true;

let mut to_mark_mutate = Vec::new();
for (other, kind) in &e.infects_to {
if *kind == AccessKind::Reference {
to_mark_mutate.push(other.clone())
}
}

for other in to_mark_mutate {
let other = self.vars.entry(other).or_insert_with(|| {
let simple_assign = ctx.is_exact_reassignment && !ctx.is_op_assign;

VarUsageInfo {
used_above_decl: !simple_assign,
..Default::default()
}
});

other.has_property_mutation = true;
}
}
}

impl ScopeDataLike for ScopeData {
Expand Down Expand Up @@ -447,10 +472,6 @@ impl VarDataLike for VarUsageInfo {
self.has_property_access = true;
}

fn mark_has_property_mutation(&mut self) {
self.has_property_mutation = true;
}

fn mark_used_as_callee(&mut self) {
self.callee_count += 1;
}
Expand Down Expand Up @@ -650,15 +671,6 @@ impl ProgramData {

// Passing object as a argument is possibly modification.
e.mutated |= is_modify || (call_may_mutate && ctx.is_exact_arg);
let mut to_mark_mutate = Vec::new();
if call_may_mutate && ctx.is_exact_arg {
e.has_property_mutation = true;
for (other, kind) in e.infects_to.clone() {
if kind == AccessKind::Reference {
to_mark_mutate.push(other)
}
}
}

e.executed_multiple_time |= ctx.executed_multiple_time;
e.used_in_cond |= ctx.in_cond;
Expand All @@ -676,7 +688,7 @@ impl ProgramData {
&& e.var_kind != Some(VarDeclKind::Const)
&& !inited
{
self.initialized_vars.insert(i);
self.initialized_vars.insert(i.clone());
e.assign_count -= 1;
e.var_initialized = true;
} else {
Expand All @@ -695,19 +707,8 @@ impl ProgramData {
e.usage_count += 1;
}

for other in to_mark_mutate {
let other = self.vars.entry(other).or_insert_with(|| {
// trace!("insert({}{:?})", i.0, i.1);

let simple_assign = ctx.is_exact_reassignment && !ctx.is_op_assign;

VarUsageInfo {
used_above_decl: !simple_assign,
..Default::default()
}
});

other.has_property_mutation = true;
if call_may_mutate && ctx.is_exact_arg {
self.mark_property_mutattion(i, ctx)
}
}
}
6 changes: 4 additions & 2 deletions crates/swc_ecma_minifier/tests/benches-full/echarts.js
Original file line number Diff line number Diff line change
Expand Up @@ -18546,11 +18546,13 @@
layout.r = layout.r0, layout.r0 = tmp;
}
var r = mathMin$6(layout.r, coordSysClipArea.r), r0 = mathMax$6(layout.r0, coordSysClipArea.r0);
if (layout.r = r, layout.r0 = r0, signR < 0) {
layout.r = r, layout.r0 = r0;
var clipped = r - r0 < 0;
if (signR < 0) {
var tmp = layout.r;
layout.r = layout.r0, layout.r0 = tmp;
}
return r - r0 < 0;
return clipped;
}
}, elementCreator = {
cartesian2d: function(seriesModel, data, newIndex, layout, isHorizontal, animationModel, axisModel, isUpdate, roundCap) {
Expand Down
6 changes: 6 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7500/input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var globalArray = [1, 1, 1];
module.exports = function () {
var localArray = globalArray;
localArray[0] = localArray[1] = localArray[2] = 0;
return localArray;
};
8 changes: 8 additions & 0 deletions crates/swc_ecma_minifier/tests/fixture/issues/7500/output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
var globalArray = [
1,
1,
1
];
module.exports = function() {
return globalArray[0] = globalArray[1] = globalArray[2] = 0, globalArray;
};
Original file line number Diff line number Diff line change
Expand Up @@ -1823,7 +1823,8 @@
}, NativeScrollbars.prototype.setScrollTop = function(pos) {
this.vert.scrollTop != pos && (this.vert.scrollTop = pos), this.disableVert && this.enableZeroWidthBar(this.vert, this.disableVert, "vert");
}, NativeScrollbars.prototype.zeroWidthHack = function() {
this.horiz.style.height = this.vert.style.width = mac && !mac_geMountainLion ? "12px" : "18px", this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none", this.disableHoriz = new Delayed(), this.disableVert = new Delayed();
var w = mac && !mac_geMountainLion ? "12px" : "18px";
this.horiz.style.height = this.vert.style.width = w, this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none", this.disableHoriz = new Delayed(), this.disableVert = new Delayed();
}, NativeScrollbars.prototype.enableZeroWidthBar = function(bar, delay, type) {
bar.style.pointerEvents = "auto", delay.set(1000, function maybeDisable() {
var box = bar.getBoundingClientRect();
Expand Down

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions crates/swc_ecma_usage_analyzer/src/analyzer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -850,13 +850,13 @@ where
v.mark_indexed_with_dynamic_key();
}

if self.ctx.in_assign_lhs || self.ctx.is_delete_arg {
v.mark_has_property_mutation();
}

if let MemberProp::Ident(prop) = &e.prop {
v.add_accessed_property(prop.sym.clone());
}

if self.ctx.in_assign_lhs || self.ctx.is_delete_arg {
self.data.mark_property_mutattion(obj.to_id(), self.ctx)
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_usage_analyzer/src/analyzer/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ pub trait Storage: Sized + Default {

fn get_initialized_cnt(&self) -> usize;
fn truncate_initialized_cnt(&mut self, len: usize);

fn mark_property_mutattion(&mut self, id: Id, ctx: Ctx);
}

pub trait ScopeDataLike: Sized + Default + Clone {
Expand All @@ -55,8 +57,6 @@ pub trait VarDataLike: Sized {

fn mark_has_property_access(&mut self);

fn mark_has_property_mutation(&mut self);

fn mark_used_as_callee(&mut self);

fn mark_used_as_arg(&mut self);
Expand Down

1 comment on commit 7f9f0b8

@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: 7f9f0b8 Previous: d545df6 Ratio
es/full/bugs-1 307783 ns/iter (± 7577) 356296 ns/iter (± 15224) 0.86
es/full/minify/libraries/antd 1490980646 ns/iter (± 17109322) 1807570787 ns/iter (± 18858660) 0.82
es/full/minify/libraries/d3 315376713 ns/iter (± 5958092) 363801138 ns/iter (± 7846654) 0.87
es/full/minify/libraries/echarts 1206994815 ns/iter (± 5037923) 1398134146 ns/iter (± 16248103) 0.86
es/full/minify/libraries/jquery 95047604 ns/iter (± 239309) 109397340 ns/iter (± 694313) 0.87
es/full/minify/libraries/lodash 113142735 ns/iter (± 1357721) 129672104 ns/iter (± 1216351) 0.87
es/full/minify/libraries/moment 55839073 ns/iter (± 170007) 63039631 ns/iter (± 415464) 0.89
es/full/minify/libraries/react 19999043 ns/iter (± 37357) 22639492 ns/iter (± 122372) 0.88
es/full/minify/libraries/terser 246446972 ns/iter (± 710794) 288047420 ns/iter (± 2328905) 0.86
es/full/minify/libraries/three 435833072 ns/iter (± 2456695) 510668991 ns/iter (± 5351346) 0.85
es/full/minify/libraries/typescript 3003623373 ns/iter (± 9652755) 3421726501 ns/iter (± 11743941) 0.88
es/full/minify/libraries/victory 647142461 ns/iter (± 5333664) 767647093 ns/iter (± 6364750) 0.84
es/full/minify/libraries/vue 138230877 ns/iter (± 644517) 158988415 ns/iter (± 864873) 0.87
es/full/codegen/es3 36321 ns/iter (± 120) 40598 ns/iter (± 95) 0.89
es/full/codegen/es5 36282 ns/iter (± 36) 40847 ns/iter (± 39) 0.89
es/full/codegen/es2015 36283 ns/iter (± 65) 40742 ns/iter (± 133) 0.89
es/full/codegen/es2016 36245 ns/iter (± 64) 40681 ns/iter (± 130) 0.89
es/full/codegen/es2017 36309 ns/iter (± 43) 40698 ns/iter (± 68) 0.89
es/full/codegen/es2018 36232 ns/iter (± 84) 40705 ns/iter (± 54) 0.89
es/full/codegen/es2019 36323 ns/iter (± 85) 40713 ns/iter (± 41) 0.89
es/full/codegen/es2020 36286 ns/iter (± 53) 40707 ns/iter (± 125) 0.89
es/full/all/es3 179791533 ns/iter (± 719633) 206684493 ns/iter (± 2700788) 0.87
es/full/all/es5 171539536 ns/iter (± 886500) 198577663 ns/iter (± 3233078) 0.86
es/full/all/es2015 127066027 ns/iter (± 498451) 153111164 ns/iter (± 2183038) 0.83
es/full/all/es2016 126586740 ns/iter (± 521394) 153047977 ns/iter (± 2538164) 0.83
es/full/all/es2017 125489097 ns/iter (± 708529) 151496410 ns/iter (± 2623817) 0.83
es/full/all/es2018 123958117 ns/iter (± 501698) 149247219 ns/iter (± 3837961) 0.83
es/full/all/es2019 123461546 ns/iter (± 574127) 151126372 ns/iter (± 2321463) 0.82
es/full/all/es2020 118184621 ns/iter (± 317167) 144305481 ns/iter (± 3007284) 0.82
es/full/parser 517191 ns/iter (± 3961) 606815 ns/iter (± 9013) 0.85
es/full/base/fixer 18236 ns/iter (± 128) 24466 ns/iter (± 39) 0.75
es/full/base/resolver_and_hygiene 90877 ns/iter (± 276) 104089 ns/iter (± 90) 0.87
serialization of serde 316 ns/iter (± 0) 282 ns/iter (± 0) 1.12
css/minify/libraries/bootstrap 30915808 ns/iter (± 144697) 36125710 ns/iter (± 137360) 0.86
css/visitor/compare/clone 1906383 ns/iter (± 12333) 2367558 ns/iter (± 8382) 0.81
css/visitor/compare/visit_mut_span 2050453 ns/iter (± 6002) 2543511 ns/iter (± 1954) 0.81
css/visitor/compare/visit_mut_span_panic 2128272 ns/iter (± 7926) 2599687 ns/iter (± 4582) 0.82
css/visitor/compare/fold_span 2807297 ns/iter (± 12453) 3321353 ns/iter (± 10818) 0.85
css/visitor/compare/fold_span_panic 3016782 ns/iter (± 11302) 3480432 ns/iter (± 17455) 0.87
css/lexer/bootstrap_5_1_3 4814585 ns/iter (± 2310) 5562004 ns/iter (± 5242) 0.87
css/lexer/foundation_6_7_4 4051902 ns/iter (± 1979) 4704291 ns/iter (± 5634) 0.86
css/lexer/tailwind_3_1_1 764265 ns/iter (± 278) 892464 ns/iter (± 553) 0.86
css/parser/bootstrap_5_1_3 20586787 ns/iter (± 24884) 23833844 ns/iter (± 93887) 0.86
css/parser/foundation_6_7_4 16577051 ns/iter (± 69764) 19025931 ns/iter (± 49543) 0.87
css/parser/tailwind_3_1_1 3199868 ns/iter (± 2839) 3673394 ns/iter (± 32136) 0.87
es/codegen/colors 740624 ns/iter (± 401173) 734385 ns/iter (± 396361) 1.01
es/codegen/large 3120128 ns/iter (± 1635030) 3116361 ns/iter (± 1643760) 1.00
es/codegen/with-parser/colors 48887 ns/iter (± 243) 58178 ns/iter (± 425) 0.84
es/codegen/with-parser/large 521112 ns/iter (± 3305) 571768 ns/iter (± 2130) 0.91
es/minify/libraries/antd 1323790696 ns/iter (± 13689427) 1582587919 ns/iter (± 14028773) 0.84
es/minify/libraries/d3 281493184 ns/iter (± 1478748) 311129895 ns/iter (± 2865092) 0.90
es/minify/libraries/echarts 1056905603 ns/iter (± 7906080) 1250373180 ns/iter (± 12788585) 0.85
es/minify/libraries/jquery 83551073 ns/iter (± 222946) 98210452 ns/iter (± 1845950) 0.85
es/minify/libraries/lodash 102003795 ns/iter (± 212712) 115360323 ns/iter (± 1192146) 0.88
es/minify/libraries/moment 49159782 ns/iter (± 97254) 55854897 ns/iter (± 374666) 0.88
es/minify/libraries/react 17846904 ns/iter (± 49528) 20502163 ns/iter (± 134800) 0.87
es/minify/libraries/terser 213567474 ns/iter (± 840212) 249349040 ns/iter (± 1815088) 0.86
es/minify/libraries/three 372482774 ns/iter (± 1924747) 428800468 ns/iter (± 3107512) 0.87
es/minify/libraries/typescript 2613162969 ns/iter (± 10441432) 2972633708 ns/iter (± 18589519) 0.88
es/minify/libraries/victory 551217447 ns/iter (± 4675303) 661061241 ns/iter (± 9714029) 0.83
es/minify/libraries/vue 123457896 ns/iter (± 738900) 143459760 ns/iter (± 1024241) 0.86
es/visitor/compare/clone 2079708 ns/iter (± 9511) 2400271 ns/iter (± 8346) 0.87
es/visitor/compare/visit_mut_span 2409416 ns/iter (± 3513) 2778309 ns/iter (± 11628) 0.87
es/visitor/compare/visit_mut_span_panic 2449959 ns/iter (± 2954) 2831730 ns/iter (± 5440) 0.87
es/visitor/compare/fold_span 3488994 ns/iter (± 6413) 3931919 ns/iter (± 8965) 0.89
es/visitor/compare/fold_span_panic 3616746 ns/iter (± 13140) 4052297 ns/iter (± 16794) 0.89
es/lexer/colors 13087 ns/iter (± 59) 14720 ns/iter (± 37) 0.89
es/lexer/angular 6253308 ns/iter (± 10990) 6927232 ns/iter (± 2077) 0.90
es/lexer/backbone 818490 ns/iter (± 1710) 848298 ns/iter (± 423) 0.96
es/lexer/jquery 4619606 ns/iter (± 3578) 4750432 ns/iter (± 7359) 0.97
es/lexer/jquery mobile 7082083 ns/iter (± 4298) 7347217 ns/iter (± 13373) 0.96
es/lexer/mootools 3654247 ns/iter (± 4146) 3747668 ns/iter (± 3043) 0.98
es/lexer/underscore 693703 ns/iter (± 859) 705175 ns/iter (± 218) 0.98
es/lexer/three 21803955 ns/iter (± 34962) 22314088 ns/iter (± 14420) 0.98
es/lexer/yui 4054871 ns/iter (± 1919) 4277796 ns/iter (± 2258) 0.95
es/parser/colors 29370 ns/iter (± 93) 33431 ns/iter (± 73) 0.88
es/parser/angular 14459825 ns/iter (± 592043) 16704407 ns/iter (± 134771) 0.87
es/parser/backbone 2138656 ns/iter (± 11336) 2412270 ns/iter (± 13594) 0.89
es/parser/jquery 11691667 ns/iter (± 35685) 13021526 ns/iter (± 160811) 0.90
es/parser/jquery mobile 17854597 ns/iter (± 46470) 20133216 ns/iter (± 222467) 0.89
es/parser/mootools 8932900 ns/iter (± 15419) 9926062 ns/iter (± 25335) 0.90
es/parser/underscore 1866976 ns/iter (± 8857) 2055236 ns/iter (± 9052) 0.91
es/parser/three 49498644 ns/iter (± 205186) 58832206 ns/iter (± 758108) 0.84
es/parser/yui 8972468 ns/iter (± 29532) 10047101 ns/iter (± 57307) 0.89
es/preset-env/usage/builtin_type 145339 ns/iter (± 31175) 152133 ns/iter (± 33037) 0.96
es/preset-env/usage/property 20271 ns/iter (± 54) 28741 ns/iter (± 76) 0.71
es/resolver/typescript 92968979 ns/iter (± 1396577) 119266597 ns/iter (± 2166577) 0.78
es/fixer/typescript 65904892 ns/iter (± 532711) 79622211 ns/iter (± 613078) 0.83
es/hygiene/typescript 141676734 ns/iter (± 1028313) 180387747 ns/iter (± 808411) 0.79
es/resolver_with_hygiene/typescript 304889704 ns/iter (± 1768070) 384408682 ns/iter (± 2540826) 0.79
es/visitor/base-perf/module_clone 62496 ns/iter (± 256) 84022 ns/iter (± 1116) 0.74
es/visitor/base-perf/fold_empty 65583 ns/iter (± 360) 93190 ns/iter (± 339) 0.70
es/visitor/base-perf/fold_noop_impl_all 66216 ns/iter (± 201) 93805 ns/iter (± 496) 0.71
es/visitor/base-perf/fold_noop_impl_vec 66150 ns/iter (± 253) 94538 ns/iter (± 415) 0.70
es/visitor/base-perf/boxing_boxed_clone 61 ns/iter (± 0) 60 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 44 ns/iter (± 0) 0.93
es/visitor/base-perf/boxing_boxed 119 ns/iter (± 0) 105 ns/iter (± 0) 1.13
es/visitor/base-perf/boxing_unboxed 81 ns/iter (± 0) 82 ns/iter (± 0) 0.99
es/visitor/base-perf/visit_empty 0 ns/iter (± 0)
es/visitor/base-perf/visit_contains_this 2680 ns/iter (± 16) 3489 ns/iter (± 56) 0.77
es/base/parallel/resolver/typescript 4640573954 ns/iter (± 287384549) 6650051758 ns/iter (± 376744063) 0.70
es/base/parallel/hygiene/typescript 1570066256 ns/iter (± 30585886) 2180664258 ns/iter (± 31592037) 0.72
misc/visitors/time-complexity/time 5 104 ns/iter (± 0) 113 ns/iter (± 0) 0.92
misc/visitors/time-complexity/time 10 267 ns/iter (± 0) 370 ns/iter (± 0) 0.72
misc/visitors/time-complexity/time 15 504 ns/iter (± 39) 769 ns/iter (± 0) 0.66
misc/visitors/time-complexity/time 20 1060 ns/iter (± 2) 1435 ns/iter (± 9) 0.74
misc/visitors/time-complexity/time 40 3551 ns/iter (± 204) 7439 ns/iter (± 3) 0.48
misc/visitors/time-complexity/time 60 7538 ns/iter (± 36) 18826 ns/iter (± 4) 0.40
es/full-target/es2016 240264 ns/iter (± 761) 269877 ns/iter (± 355) 0.89
es/full-target/es2017 226490 ns/iter (± 479) 259040 ns/iter (± 394) 0.87
es/full-target/es2018 215160 ns/iter (± 612) 247973 ns/iter (± 316) 0.87
es2020_nullish_coalescing 73550 ns/iter (± 314) 98527 ns/iter (± 419) 0.75
es2020_optional_chaining 103634 ns/iter (± 748) 131858 ns/iter (± 241) 0.79
es2022_class_properties 121562 ns/iter (± 564) 155661 ns/iter (± 310) 0.78
es2018_object_rest_spread 77083 ns/iter (± 326) 99605 ns/iter (± 283) 0.77
es2019_optional_catch_binding 65485 ns/iter (± 137) 88351 ns/iter (± 226) 0.74
es2017_async_to_generator 66259 ns/iter (± 153) 88646 ns/iter (± 209) 0.75
es2016_exponentiation 71392 ns/iter (± 257) 95431 ns/iter (± 209) 0.75
es2015_arrow 73853 ns/iter (± 307) 97968 ns/iter (± 249) 0.75
es2015_block_scoped_fn 70233 ns/iter (± 341) 96565 ns/iter (± 320) 0.73
es2015_block_scoping 134162 ns/iter (± 661) 185395 ns/iter (± 279) 0.72

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

Please sign in to comment.