Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf(traverse): generate_uid cache available binding names #5611

Conversation

overlookmotel
Copy link
Contributor

@overlookmotel overlookmotel commented Sep 8, 2024

Close #5488.

generate_uid previously iterated through every symbol and unresolved reference in the AST to find a unique var name. If the first var name it tried was already in use, it'd iterate again.

Instead build a hash map recording existing var names in use for every name which could clash with a UID (any var name starting with _). Once built, use that hash map to generate UIDs without iterating through all symbols again.

I had hoped to make generate_uid cheaper still by just recording the highest digits postfix for each var name, and then incrementing that postfix for each UID. i.e. if AST contains vars _foo1 and _foo6, create UIDs starting at one number higher - _foo7, _foo8 etc. This method would be more efficient, but unfortunately it does not match Babel, and so causes some of Babel's tests to fail.

Copy link

graphite-app bot commented Sep 8, 2024

Your org has enabled the Graphite merge queue for merging into main

Add the label “0-merge” to the PR and Graphite will automatically add it to the merge queue when it’s ready to merge. Or use the label “hotfix” to add to the merge queue as a hot fix.

You must have a Graphite account and log in to Graphite in order to use the merge queue. Sign up using this link.

Copy link
Contributor Author

overlookmotel commented Sep 8, 2024

@overlookmotel overlookmotel marked this pull request as ready for review September 8, 2024 13:49
@overlookmotel overlookmotel marked this pull request as draft September 8, 2024 13:50
@overlookmotel overlookmotel force-pushed the 09-08-feat_span_format_compact_str_macro branch from 4ea26bc to 0578754 Compare September 8, 2024 13:54
@overlookmotel overlookmotel force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch from 1678069 to d3fcb66 Compare September 8, 2024 13:54
Copy link

codspeed-hq bot commented Sep 8, 2024

CodSpeed Performance Report

Merging #5611 will improve performances by ×2.6

Comparing 09-08-perf_traverse_generate_uid_cache_available_binding_names (4996874) with main (e698418)

Summary

⚡ 3 improvements
✅ 26 untouched benchmarks

Benchmarks breakdown

Benchmark main 09-08-perf_traverse_generate_uid_cache_available_binding_names Change
transformer[cal.com.tsx] 62 ms 23.9 ms ×2.6
transformer[checker.ts] 28.8 ms 16.7 ms +72.85%
transformer[pdf.mjs] 10.5 ms 6.4 ms +63.06%

@Boshen Boshen changed the base branch from 09-08-feat_span_format_compact_str_macro to graphite-base/5611 September 8, 2024 14:15
@Boshen Boshen force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch from d3fcb66 to db35b84 Compare September 8, 2024 14:22
@Boshen Boshen force-pushed the graphite-base/5611 branch from 0578754 to b3cbd56 Compare September 8, 2024 14:22
@Boshen Boshen changed the base branch from graphite-base/5611 to main September 8, 2024 14:23
@Boshen Boshen force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch from db35b84 to 26769b4 Compare September 8, 2024 14:23
@DonIsaac DonIsaac added C-performance Category - Solution not expected to change functional behavior, only performance A-transformer Area - Transformer / Transpiler labels Sep 8, 2024
@overlookmotel overlookmotel force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch 2 times, most recently from 42c8adc to 044958c Compare September 8, 2024 17:37
@overlookmotel overlookmotel marked this pull request as ready for review September 8, 2024 17:38
@overlookmotel overlookmotel requested a review from Boshen September 8, 2024 17:38
@overlookmotel
Copy link
Contributor Author

I'll see if can tweak it a little to speed it up further in follow-up PRs.

@overlookmotel
Copy link
Contributor Author

bench

There was a time when this would have been pretty spectacular. But after #5518 it's futile trying to compete!

@overlookmotel overlookmotel force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch 2 times, most recently from 8077398 to c7c4d6f Compare September 8, 2024 22:08
@overlookmotel overlookmotel marked this pull request as draft September 9, 2024 00:48
@overlookmotel overlookmotel force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch from c7c4d6f to a3ab781 Compare September 9, 2024 08:51
@overlookmotel
Copy link
Contributor Author

Have merged the improvements made in #5623 and #5624 into this. Ready for review.

@overlookmotel overlookmotel marked this pull request as ready for review September 9, 2024 08:53
@Boshen Boshen requested a review from Dunqing September 9, 2024 09:18
@overlookmotel overlookmotel force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch from a3ab781 to 1bdd5d9 Compare September 9, 2024 10:43
@Boshen Boshen added the 0-merge Merge with Graphite Merge Queue label Sep 10, 2024 — with Graphite App
Copy link

graphite-app bot commented Sep 10, 2024

Merge activity

Close #5488.

`generate_uid` previously iterated through every symbol and unresolved reference in the AST to find a unique var name. If the first var name it tried was already in use, it'd iterate again.

Instead build a hash map recording existing var names in use for every name which could clash with a UID (any var name starting with `_`). Once built, use that hash map to generate UIDs without iterating through all symbols again.

I had hoped to make `generate_uid` cheaper still by just recording the highest digits postfix for each var name, and then incrementing that postfix for each UID. i.e. if AST contains vars `_foo1` and `_foo6`, create UIDs starting at one number higher - `_foo7`, `_foo8` etc. This method would be more efficient, but unfortunately it does not match Babel, and so causes some of Babel's tests to fail.
@Boshen Boshen force-pushed the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch from 1bdd5d9 to 4996874 Compare September 10, 2024 01:12
@graphite-app graphite-app bot merged commit 4996874 into main Sep 10, 2024
26 checks passed
@graphite-app graphite-app bot deleted the 09-08-perf_traverse_generate_uid_cache_available_binding_names branch September 10, 2024 01:16
Boshen added a commit that referenced this pull request Sep 11, 2024
## [0.28.0] - 2024-09-11

- afc4548 ast: [**BREAKING**] Educe byte size of
`TaggedTemplateExpression::quasi` by `Boxing` it (#5679) (Boshen)

- 7415e85 ast: [**BREAKING**] Reduce byte size of
`TSImportType::attributes` by `Box`ing it (#5678) (Boshen)

- ee4fb42 ast: [**BREAKING**] Reduce size of `WithClause` by `Box`ing it
(#5677) (Boshen)

- 1fa3e56 semantic: [**BREAKING**] Rename `SymbolTable::iter` to
`symbol_ids` (#5621) (overlookmotel)

- 96a1552 semantic: [**BREAKING**] Remove `SymbolTable::iter_rev`
(#5620) (overlookmotel)

- 4a8aec1 span: [**BREAKING**] Change `SourceType::js` to
`SourceType::cjs` and `SourceType::mjs` (#5606) (Boshen)

- 603817b oxc: [**BREAKING**] Add `SourceType::Unambiguous`; parse `.js`
as unambiguous (#5557) (Boshen)

- b060525 semantic: [**BREAKING**] Remove `source_type` argument from
`SemanticBuilder::new` (#5553) (Boshen)

### Features

- 2da5ad1 ast: Add `JSXElementName::get_identifier` method (#5556)
(overlookmotel)
- 2016bae coverage: Add regular expression idempotency test (#5676)
(Boshen)
- 68c3cf5 minifier: Fold `void 1` -> `void 0` (#5670) (Boshen)
- c6bbf94 minifier: Constant fold unary expression (#5669) (Boshen)
- 86256ea minifier: Constant fold `typeof` (#5666) (Boshen)
- e698418 napi/transform: Align output `SourceMap` with Rollup's
`ExistingRawSourceMap` (#5657) (Boshen)
- aba9194 napi/transform: Export react refresh options (#5533)
(underfin)
- 642295c semantic: Add `SymbolTable::delete_resolved_reference` method
(#5558) (overlookmotel)
- b3cbd56 span: `format_compact_str!` macro (#5610) (overlookmotel)
- 95a6d99 transformer: Enable the react refresh plugin in enable_all
(#5630) (Dunqing)
- 7b543df transformer/react: Handle `refresh_sig` and `refresh_reg`
options correctly (#5638) (Dunqing)
- 17226dd traverse: Add methods for deleting references (#5559)
(overlookmotel)

### Bug Fixes

- d62defb codegen: Do not print trailing commas for `ArrayExpression`
(#5551) (Boshen)
- 1bc08e2 coverage: Parse babel unambiguously (#5579) (Boshen)
- 28b934c coverage: Apply `always_strict` to test262 and typescript per
the specifcation (#5555) (Boshen)
- b9bf544 isolated-declarations: False positive for setter method in
`interface` (#5681) (Dunqing)
- 6e8409a isolated-declarations: Bindings referenced in
`TSModuleDeclaration` are removed incorrectly (#5680) (Dunqing)
- b8f8dd6 minifier/replace_global_defines: Do not replace shadowed
identifiers (#5691) (Boshen)
- 304ce25 regular_expression: Keep LegacyOctalEscape raw digits for
`to_string` (#5692) (leaysgur)
- 0511d55 regular_expression: Report more MayContainStrings error in
(nested)class (#5661) (leaysgur)
- 41582ea regular_expression: Improve RegExp `to_string()` results
(#5635) (leaysgur)
- 28aad28 regular_expression: Handle `-` in `/[\-]/u` as escaped
character (#5631) (leaysgur)
- f9e3a41 semantic: Bind `SymbolId` to function name in `if (foo)
function id() {}` (#5673) (Boshen)
- f49e6eb span: Treat `.js` as `module` file (reverts the previous
breaking change) (#5612) (Boshen)
- 919d17f transform_conformance: Only print semantic mismatch errors
when output is correct (#5589) (Boshen)
- 505d064 transformer: JSX transform delete references for
`JSXClosingElement`s (#5560) (overlookmotel)
- 9b7ecc7 transformer: RegExp transform only set span on final
expression (#5508) (overlookmotel)
- d1ece19 transformer: RegExp transform handle `Term::Quantifier`
(#5501) (overlookmotel)
- a1afd48 transformer/react: Incorrect scope_id for var hoisted in fast
refresh plugin (#5695) (Dunqing)
- f2f5e5a transformer/react: Missing scope_id for function in fast
refresh plugin (#5693) (Dunqing)
- a891c31 transformer/react: Refresh plugin has incorrect reference
flags (#5656) (Dunqing)
- 3e8b96f transformer/react: The refresh plugin cannot handle member
expressions with React hooks (#5655) (Dunqing)
- 0739b5f transformer/react: Don't transform declaration of function
overloads (#5642) (Dunqing)
- 3bf6aaf transformer/react: Support `emit_full_signatures` option in
refresh plugin (#5629) (Dunqing)
- 36d864a transformer/react: Don't transform if the variable does not
have a value reference (#5528) (Dunqing)

### Performance

- e8013d2 traverse: Faster string operations generating UIDs (#5626)
(overlookmotel)
- 4996874 traverse: `generate_uid` cache available binding names (#5611)
(overlookmotel)

### Documentation

- fefbbc1 sourcemap: Add trailing newline to README (#5539)
(overlookmotel)
- 9282647 transformer: Comment on RegExp transform for potential
improvement (#5514) (overlookmotel)
- 1c051ae traverse: Correct code comment 2 (#5607) (overlookmotel)
- 2e24a15 traverse: Correct code comment (#5604) (overlookmotel)

### Refactor

- 14ee086 ast: Inline `AstKind::as_*` methods (#5547) (overlookmotel)
- 2de6ea0 index, traverse: Remove unnecessary type annotations (#5650)
(overlookmotel)
- 0ac420d linter: Use meaningful names for diagnostic parameters (#5564)
(Don Isaac)
- 2da42ef regular_expression: Improve AST docs with refactoring
may_contain_strings (#5665) (leaysgur)
- dec1395 regular_expression: Align diagnostics (#5543) (leaysgur)
- 731ffaa semantic: Compare nodes by pointer equality (#5686)
(overlookmotel)
- 067f9b5 semantic: Introduce `IsGlobalReference` trait (#5672) (Boshen)
- d22a9b7 semantic: `SymbolTable::is_empty` use `is_empty` (#5622)
(overlookmotel)
- 3d190a5 span: Move `CompactStr` into separate file (#5609)
(overlookmotel)
- 5532628 span: Put types and impl in the same mod file (Boshen)
- ce71982 transformer: Shorten code in JSX transform (#5554)
(overlookmotel)
- 758a10c transformer: RegExp transform reuse var (#5527)
(overlookmotel)
- fad0a05 transformer: RegExp transform unbox early (#5504)
(overlookmotel)
- 19cdcc5 traverse: Revert changes to `walk.rs` (#5652) (overlookmotel)-
26d9235 Enable clippy::ref_as_ptr (#5577) (夕舞八弦)

### Styling

- e52d006 traverse: Fix formatting of traverse codegen (#5651)
(overlookmotel)
- 97e99bd traverse: Remove excess line break (#5603) (overlookmotel)-
694f032 Add trailing line breaks to `package.json` files (#5542)
(overlookmotel)

### Testing

- 2e367c9 traverse: Enable tests for `oxc_traverse` crate (#5625)
(overlookmotel)- dc92489 Add trailing line breaks to conformance
fixtures (#5541) (overlookmotel)

---------

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
0-merge Merge with Graphite Merge Queue A-transformer Area - Transformer / Transpiler C-performance Category - Solution not expected to change functional behavior, only performance
Projects
None yet
Development

Successfully merging this pull request may close these issues.

transformer: performance regression from generated_uid
4 participants