Avatar for the oxc-project user
oxc-project
oxc
Instrumentation
Wall Time
BlogDocsChangelog

feat(minifier): compress `a.b = a.b + c` to `a.b += c`

#8367Merged
Comparing
01-09-feat_minifier_compress_member_binary
(
a596821
) with
main
(
aa5e65f
)
CodSpeed Performance Gauge
0%
Improvements
0
Regressions
0
Untouched
29
New
0
Dropped
0
Ignored
0

Benchmarks

Passed

semantic[RadixUIAdoptionSection.jsx]
tasks/benchmark/benches/semantic.rs::semantic::bench_semantic::semantic[RadixUIAdoptionSection.jsx]
CodSpeed Performance Gauge
+1%
74.1 µs
73.7 µs
semantic[pdf.mjs]
tasks/benchmark/benches/semantic.rs::semantic::bench_semantic::semantic[pdf.mjs]
CodSpeed Performance Gauge
0%
17.7 ms
17.6 ms
minifier[react.development.js]
tasks/benchmark/benches/minifier.rs::minifier::bench_minifier::minifier[react.development.js]
CodSpeed Performance Gauge
0%
1.3 ms
1.3 ms
minifier[typescript.js]
tasks/benchmark/benches/minifier.rs::minifier::bench_minifier::minifier[typescript.js]
CodSpeed Performance Gauge
0%
293.7 ms
293.5 ms
codegen[checker.ts]
tasks/benchmark/benches/codegen.rs::codegen::bench_codegen::codegen[checker.ts]
CodSpeed Performance Gauge
0%
25.1 ms
25.1 ms
parser[RadixUIAdoptionSection.jsx]
tasks/benchmark/benches/parser.rs::parser::bench_parser::parser[RadixUIAdoptionSection.jsx]
CodSpeed Performance Gauge
0%
87.4 µs
87.4 µs
linter[checker.ts]
tasks/benchmark/benches/linter.rs::linter::bench_linter::linter[checker.ts]
CodSpeed Performance Gauge
0%
2.7 s
2.7 s
minifier[antd.js]
tasks/benchmark/benches/minifier.rs::minifier::bench_minifier::minifier[antd.js]
CodSpeed Performance Gauge
0%
199.6 ms
199.6 ms
lexer[cal.com.tsx]
tasks/benchmark/benches/lexer.rs::lexer::bench_lexer::lexer[cal.com.tsx]
CodSpeed Performance Gauge
0%
5.5 ms
5.5 ms
lexer[checker.ts]
tasks/benchmark/benches/lexer.rs::lexer::bench_lexer::lexer[checker.ts]
CodSpeed Performance Gauge
0%
13.2 ms
13.2 ms
parser[pdf.mjs]
tasks/benchmark/benches/parser.rs::parser::bench_parser::parser[pdf.mjs]
CodSpeed Performance Gauge
0%
17.5 ms
17.5 ms
linter[cal.com.tsx]
tasks/benchmark/benches/linter.rs::linter::bench_linter::linter[cal.com.tsx]
CodSpeed Performance Gauge
0%
1.1 s
1.1 s
parser[checker.ts]
tasks/benchmark/benches/parser.rs::parser::bench_parser::parser[checker.ts]
CodSpeed Performance Gauge
0%
54 ms
54 ms
lexer[pdf.mjs]
tasks/benchmark/benches/lexer.rs::lexer::bench_lexer::lexer[pdf.mjs]
CodSpeed Performance Gauge
0%
3.6 ms
3.6 ms
isolated-declarations[vue-id.ts]
tasks/benchmark/benches/isolated_declarations.rs::transformer::bench_isolated_declarations::isolated-declarations[vue-id.ts]
CodSpeed Performance Gauge
0%
725 ms
725 ms
lexer[antd.js]
tasks/benchmark/benches/lexer.rs::lexer::bench_lexer::lexer[antd.js]
CodSpeed Performance Gauge
0%
22.3 ms
22.3 ms
parser[antd.js]
tasks/benchmark/benches/parser.rs::parser::bench_parser::parser[antd.js]
CodSpeed Performance Gauge
0%
107.2 ms
107.2 ms
semantic[antd.js]
tasks/benchmark/benches/semantic.rs::semantic::bench_semantic::semantic[antd.js]
CodSpeed Performance Gauge
0%
107.1 ms
107.1 ms
transformer[checker.ts]
tasks/benchmark/benches/transformer.rs::transformer::bench_transformer::transformer[checker.ts]
CodSpeed Performance Gauge
0%
25.2 ms
25.2 ms
transformer[pdf.mjs]
tasks/benchmark/benches/transformer.rs::transformer::bench_transformer::transformer[pdf.mjs]
CodSpeed Performance Gauge
0%
11.1 ms
11.1 ms
semantic[checker.ts]
tasks/benchmark/benches/semantic.rs::semantic::bench_semantic::semantic[checker.ts]
CodSpeed Performance Gauge
0%
65.8 ms
65.8 ms
transformer[antd.js]
tasks/benchmark/benches/transformer.rs::transformer::bench_transformer::transformer[antd.js]
CodSpeed Performance Gauge
0%
55.5 ms
55.5 ms
parser[cal.com.tsx]
tasks/benchmark/benches/parser.rs::parser::bench_parser::parser[cal.com.tsx]
CodSpeed Performance Gauge
0%
29.6 ms
29.6 ms
linter[RadixUIAdoptionSection.jsx]
tasks/benchmark/benches/linter.rs::linter::bench_linter::linter[RadixUIAdoptionSection.jsx]
CodSpeed Performance Gauge
0%
2.5 ms
2.5 ms
transformer[cal.com.tsx]
tasks/benchmark/benches/transformer.rs::transformer::bench_transformer::transformer[cal.com.tsx]
CodSpeed Performance Gauge
0%
35.1 ms
35.1 ms
codegen_sourcemap[checker.ts]
tasks/benchmark/benches/codegen.rs::codegen::bench_codegen::codegen_sourcemap[checker.ts]
CodSpeed Performance Gauge
0%
68.5 ms
68.6 ms
lexer[RadixUIAdoptionSection.jsx]
tasks/benchmark/benches/lexer.rs::lexer::bench_lexer::lexer[RadixUIAdoptionSection.jsx]
CodSpeed Performance Gauge
-1%
23.9 µs
24.1 µs
transformer[RadixUIAdoptionSection.jsx]
tasks/benchmark/benches/transformer.rs::transformer::bench_transformer::transformer[RadixUIAdoptionSection.jsx]
CodSpeed Performance Gauge
-1%
145.9 µs
147 µs
semantic[cal.com.tsx]
tasks/benchmark/benches/semantic.rs::semantic::bench_semantic::semantic[cal.com.tsx]
CodSpeed Performance Gauge
-1%
26.5 ms
26.8 ms

Commits

Click on a commit to change the comparison range
Base
main
aa5e65f
0%
feat(minifier): compress `a.b = a.b + c` to `a.b += c` (#8367) The simplified version of the evaluation of `a += b` is: > AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression > 1. Let lRef be ? Evaluation of LeftHandSideExpression. > 2. Let lVal be ? GetValue(lRef). > 3. Let rRef be ? Evaluation of AssignmentExpression. > 4. Let rVal be ? GetValue(rRef). > 5. Let r be ? ApplyStringOrNumericBinaryOperator(lVal, opText, rVal). > 6. Perform ? PutValue(lRef, r). > 7. Return r. The simplified version of the evaluation of `a = a + b` is: > AssignmentExpression : LeftHandSideExpression = AssignmentExpressionLeft + AssignmentExpressionRight > 1. Let lRef be ? Evaluation of LeftHandSideExpression. > 2. Let alRef be ? Evaluation of AssignmentExpressionLeft. > 3. Let alVal be ? GetValue(alRef). > 4. Let arRef be ? Evaluation of AssignmentExpressionRight. > 5. Let arVal be ? GetValue(arRef). > 6. Let rRef be ? ApplyStringOrNumericBinaryOperator(alVal, opText, arVal). > 7. Let rVal be ? GetValue(rRef). [Note GetValue(rRef) returns rRef itself] > 8. Perform ? PutValue(lRef, rVal). > 9. Return rVal. The difference of these is that the evaluation of `a` is done twice for `a = a + b`, one with `1. Let lRef be ? Evaluation of LeftHandSideExpression` and one with `2. Let alRef be ? Evaluation of AssignmentExpressionLeft.` So this is same with #8366 and can be compressed similarly when the conditions are met (`a.b = a.b + c` -> `a.b += c`). **References** - [Spec of `=`, `+=`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-assignment-operators-runtime-semantics-evaluation) - [Spec of `+`](https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-addition-operator-plus-runtime-semantics-evaluation)
a596821
7 months ago
by sapphi-red
© 2025 CodSpeed Technology
Home Terms Privacy Docs