Skip to content

Commit

Permalink
feat(es/minifier): Skip function declarations in sequential inliner (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Oct 18, 2022
1 parent b197a62 commit f2e8f98
Show file tree
Hide file tree
Showing 10 changed files with 95 additions and 26 deletions.
@@ -1,10 +1,9 @@
//// [genericCallWithObjectTypeArgsAndConstraints5.ts]
var c, d;
function foo(t, t2) {
return function(x) {
return t2;
};
}
foo(d, c), foo(function() {
foo(void 0, void 0), foo(function() {
return 1;
}, function() {});
Expand Up @@ -13,14 +13,14 @@ define([
get: function() {
return MainButton;
}
}), _extends = _extends.default;
});
var obj3, obj0 = {
to: "world"
};
function MainButton(props) {
return props.to ? this._buildMainLink(props) : this._buildMainButton(props);
}
_extends({
(_extends = _extends.default)({
onClick: function(e) {}
}, obj0), _extends({}, {
to: "10000"
Expand Down
Expand Up @@ -13,15 +13,15 @@ define([
get: function() {
return MainButton;
}
}), _extends = _extends.default;
});
var obj1, obj = {
children: "hi",
to: "boo"
};
function MainButton(props) {
return props.to ? this._buildMainLink(props) : this._buildMainButton(props);
}
_extends({}, obj), _extends({}, {
(_extends = _extends.default)({}, obj), _extends({}, {
to: 10000
}, obj), _extends({}, obj1), _extends({}, obj1, {
to: "/to/somewhere"
Expand Down
71 changes: 71 additions & 0 deletions crates/swc_ecma_minifier/src/compress/optimize/sequences.rs
Expand Up @@ -591,6 +591,26 @@ where
vec![Mergable::Expr(&mut s.arg)]
}

Stmt::Decl(Decl::Fn(f)) => {
// Check for side effects

if !f.function.decorators.is_empty() {
return None;
}
for p in &f.function.params {
if !p.decorators.is_empty() {
return None;
}

if !self.is_pat_skippable_for_seq(None, &p.pat) {
return None;
}
}

// Side-effect free function can be skipped.
vec![]
}

_ => return None,
})
}
Expand Down Expand Up @@ -948,6 +968,57 @@ where
Ok(())
}

fn is_pat_skippable_for_seq(&mut self, a: Option<&Mergable>, p: &Pat) -> bool {
match p {
Pat::Ident(_) => true,
Pat::Invalid(_) => false,

Pat::Array(p) => {
for elem in p.elems.iter().flatten() {
if !self.is_pat_skippable_for_seq(a, elem) {
return false;
}
}

true
}
Pat::Rest(p) => {
if !self.is_pat_skippable_for_seq(a, &p.arg) {
return false;
}

true
}
Pat::Object(p) => {
for prop in &p.props {
match prop {
ObjectPatProp::KeyValue(KeyValuePatProp { value, key, .. }) => {
if let PropName::Computed(key) = key {
if !self.is_skippable_for_seq(a, &key.expr) {
return false;
}
}

if !self.is_pat_skippable_for_seq(a, value) {
return false;
}
}
ObjectPatProp::Assign(AssignPatProp { .. }) => return false,
ObjectPatProp::Rest(RestPat { arg, .. }) => {
if !self.is_pat_skippable_for_seq(a, arg) {
return false;
}
}
}
}

true
}
Pat::Assign(..) => false,
Pat::Expr(e) => self.is_skippable_for_seq(a, e),
}
}

#[cfg_attr(feature = "debug", tracing::instrument(skip_all))]
fn is_skippable_for_seq(&self, a: Option<&Mergable>, e: &Expr) -> bool {
if self.ctx.in_try_block {
Expand Down
14 changes: 7 additions & 7 deletions crates/swc_ecma_minifier/tests/benches-full/echarts.js
Expand Up @@ -35410,12 +35410,6 @@
'OTransform',
'MozTransform',
'msTransform'
]), TRANSITION_VENDOR = testStyle([
'webkitTransition',
'transition',
'OTransition',
'MozTransition',
'msTransition'
]);
function toCSSVendorPrefix(styleVendor, styleProp) {
if (!styleVendor) return styleProp;
Expand All @@ -35427,7 +35421,13 @@
var stl = el.currentStyle || document.defaultView && document.defaultView.getComputedStyle(el);
return stl ? style ? stl[style] : stl : null;
}
var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, 'transition'), CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform'), gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env1.transform3dSupported ? 'will-change:transform;' : '');
var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(testStyle([
'webkitTransition',
'transition',
'OTransition',
'MozTransition',
'msTransition'
]), 'transition'), CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, 'transform'), gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env1.transform3dSupported ? 'will-change:transform;' : '');
function assembleTransform(x, y, toString) {
var x0 = x.toFixed(0) + 'px', y0 = y.toFixed(0) + 'px';
if (!env1.transformSupported) return toString ? "top:" + y0 + ";left:" + x0 + ";" : [
Expand Down
7 changes: 3 additions & 4 deletions crates/swc_ecma_minifier/tests/benches-full/terser.js
Expand Up @@ -4321,9 +4321,6 @@
function next_indent() {
return indentation + options.indent_level;
}
var add_mapping = mappings ? function(token, name) {
mapping_token = token, mapping_name = name;
} : noop;
function get() {
return might_add_newline && ensure_line_len(), OUTPUT.toString();
}
Expand Down Expand Up @@ -4408,7 +4405,9 @@
var ret = cont();
return print("]"), ret;
},
add_mapping: add_mapping,
add_mapping: mappings ? function(token, name) {
mapping_token = token, mapping_name = name;
} : noop,
option: function(opt) {
return options[opt];
},
Expand Down
Expand Up @@ -1952,12 +1952,12 @@
},
11864: function(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(99677), bind = __webpack_require__(81470), Axios = __webpack_require__(250), mergeConfig = __webpack_require__(10882), defaults = __webpack_require__(52275);
var utils = __webpack_require__(99677), bind = __webpack_require__(81470), Axios = __webpack_require__(250), mergeConfig = __webpack_require__(10882);
function createInstance(defaultConfig) {
var context = new Axios(defaultConfig), instance = bind(Axios.prototype.request, context);
return utils.extend(instance, Axios.prototype, context), utils.extend(instance, context), instance;
}
var axios = createInstance(defaults);
var axios = createInstance(__webpack_require__(52275));
axios.Axios = Axios, axios.create = function(instanceConfig) {
return createInstance(mergeConfig(axios.defaults, instanceConfig));
}, axios.Cancel = __webpack_require__(69651), axios.CancelToken = __webpack_require__(88149), axios.isCancel = __webpack_require__(37606), axios.all = function(promises) {
Expand Down
Expand Up @@ -5972,14 +5972,14 @@
},
1609: function(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(4867), bind = __webpack_require__(1849), Axios = __webpack_require__(321), mergeConfig = __webpack_require__(7185), defaults = __webpack_require__(5546);
var utils = __webpack_require__(4867), bind = __webpack_require__(1849), Axios = __webpack_require__(321), mergeConfig = __webpack_require__(7185);
function createInstance(defaultConfig) {
var context = new Axios(defaultConfig), instance = bind(Axios.prototype.request, context);
return utils.extend(instance, Axios.prototype, context), utils.extend(instance, context), instance.create = function(instanceConfig) {
return createInstance(mergeConfig(defaultConfig, instanceConfig));
}, instance;
}
var axios = createInstance(defaults);
var axios = createInstance(__webpack_require__(5546));
axios.Axios = Axios, axios.CanceledError = __webpack_require__(644), axios.CancelToken = __webpack_require__(4972), axios.isCancel = __webpack_require__(6502), axios.VERSION = __webpack_require__(7288).version, axios.toFormData = __webpack_require__(7675), axios.AxiosError = __webpack_require__(723), axios.Cancel = axios.CanceledError, axios.all = function(promises) {
return Promise.all(promises);
}, axios.spread = __webpack_require__(8713), axios.isAxiosError = __webpack_require__(6268), module.exports = axios, module.exports.default = axios;
Expand Down Expand Up @@ -6037,11 +6037,11 @@
},
644: function(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
var AxiosError = __webpack_require__(723), utils = __webpack_require__(4867);
var AxiosError = __webpack_require__(723);
function CanceledError(message) {
AxiosError.call(this, null == message ? 'canceled' : message, AxiosError.ERR_CANCELED), this.name = 'CanceledError';
}
utils.inherits(CanceledError, AxiosError, {
__webpack_require__(4867).inherits(CanceledError, AxiosError, {
__CANCEL__: !0
}), module.exports = CanceledError;
},
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_minifier/tests/pass-1/seq/1/output.js
Expand Up @@ -89,4 +89,4 @@ function unix() {
function toDate() {
return new Date(this.valueOf());
}
console.log(MS_PER_400_YEARS);
console.log(3506328 * (60 * (60 * 1000)));
Expand Up @@ -1053,11 +1053,11 @@
}), $.event.special.scrollstart = {
enabled: !0,
setup: function() {
var scrolling, timer, thisObject = this, $this = $(thisObject);
var scrolling, timer, thisObject = this;
function trigger(event1, state) {
triggerCustomEvent(thisObject, (scrolling = state) ? "scrollstart" : "scrollstop", event1);
}
$this.bind(scrollEvent, function(event1) {
$(thisObject).bind(scrollEvent, function(event1) {
$.event.special.scrollstart.enabled && (scrolling || trigger(event1, !0), clearTimeout(timer), timer = setTimeout(function() {
trigger(event1, !1);
}, 50));
Expand Down

1 comment on commit f2e8f98

@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: f2e8f98 Previous: 3f0fcf4 Ratio
es/full/minify/libraries/antd 1878700661 ns/iter (± 89805750) 1872606370 ns/iter (± 28814422) 1.00
es/full/minify/libraries/d3 387487549 ns/iter (± 24752631) 408818375 ns/iter (± 10365027) 0.95
es/full/minify/libraries/echarts 1534913531 ns/iter (± 23733877) 1556083030 ns/iter (± 22452526) 0.99
es/full/minify/libraries/jquery 97368465 ns/iter (± 4243973) 107438676 ns/iter (± 2610596) 0.91
es/full/minify/libraries/lodash 110894793 ns/iter (± 3372872) 122351057 ns/iter (± 4167578) 0.91
es/full/minify/libraries/moment 56580540 ns/iter (± 3591013) 63166251 ns/iter (± 4496728) 0.90
es/full/minify/libraries/react 19357482 ns/iter (± 323906) 20288172 ns/iter (± 729913) 0.95
es/full/minify/libraries/terser 286703973 ns/iter (± 16566817) 332961845 ns/iter (± 10489824) 0.86
es/full/minify/libraries/three 531278510 ns/iter (± 14165660) 573051503 ns/iter (± 15863437) 0.93
es/full/minify/libraries/typescript 3328557689 ns/iter (± 802979766) 3506839155 ns/iter (± 38760004) 0.95
es/full/minify/libraries/victory 810374802 ns/iter (± 38787730) 839784095 ns/iter (± 15155773) 0.96
es/full/minify/libraries/vue 154479912 ns/iter (± 20640614) 162744039 ns/iter (± 6795135) 0.95
es/full/codegen/es3 34519 ns/iter (± 7662) 33584 ns/iter (± 506) 1.03
es/full/codegen/es5 34840 ns/iter (± 4451) 33710 ns/iter (± 1386) 1.03
es/full/codegen/es2015 34445 ns/iter (± 851) 33584 ns/iter (± 298) 1.03
es/full/codegen/es2016 34412 ns/iter (± 1871) 33479 ns/iter (± 1150) 1.03
es/full/codegen/es2017 34578 ns/iter (± 3276) 33574 ns/iter (± 1183) 1.03
es/full/codegen/es2018 34526 ns/iter (± 2179) 33680 ns/iter (± 1368) 1.03
es/full/codegen/es2019 34694 ns/iter (± 3055) 33555 ns/iter (± 627) 1.03
es/full/codegen/es2020 34937 ns/iter (± 3651) 33595 ns/iter (± 1748) 1.04
es/full/all/es3 197446931 ns/iter (± 17107172) 198952312 ns/iter (± 8206483) 0.99
es/full/all/es5 190941508 ns/iter (± 19185265) 187669861 ns/iter (± 8284866) 1.02
es/full/all/es2015 152983063 ns/iter (± 18275554) 148323910 ns/iter (± 5887815) 1.03
es/full/all/es2016 168569463 ns/iter (± 26540963) 148222332 ns/iter (± 5369974) 1.14
es/full/all/es2017 169171930 ns/iter (± 10811784) 147072768 ns/iter (± 4128915) 1.15
es/full/all/es2018 162416804 ns/iter (± 23845745) 145123540 ns/iter (± 6881844) 1.12
es/full/all/es2019 166985384 ns/iter (± 21256315) 145823732 ns/iter (± 7411974) 1.15
es/full/all/es2020 161254477 ns/iter (± 13654138) 139857363 ns/iter (± 5458051) 1.15
es/full/parser 749744 ns/iter (± 66676) 739990 ns/iter (± 26113) 1.01
es/full/base/fixer 27050 ns/iter (± 1496) 26922 ns/iter (± 528) 1.00
es/full/base/resolver_and_hygiene 97024 ns/iter (± 3363) 93381 ns/iter (± 2434) 1.04
serialization of ast node 212 ns/iter (± 10) 208 ns/iter (± 1) 1.02
serialization of serde 212 ns/iter (± 17) 209 ns/iter (± 3) 1.01

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

Please sign in to comment.