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(span): align Span same as usize #8298

Merged
merged 1 commit into from
Jan 18, 2025

Conversation

overlookmotel
Copy link
Contributor

@overlookmotel overlookmotel commented Jan 6, 2025

Span consists of 2 x u32 (8 bytes total). Align Span on 8 bytes on 64-bit platforms. This means that, on 64-bit platforms, Span can be treated as equivalent to a u64 and stored in a single register (instead of requiring 2).

A side-effect is that all AST structs also become aligned on 8. This will be a useful property later on as we can remove alignment calculations from Allocator::alloc (since everything now has same alignment).

BooleanLiteral (and BoundaryAssertion, CharacterClassEscape and IndexedReference from oxc_regular_expression crate) increase from 12 bytes to 16 bytes due to the higher alignment. But this makes no practical difference as they'd almost always end up with padding around them in arena anyway, as they'll be surrounded by 8-aligned types.

@github-actions github-actions bot added A-ast Area - AST A-ast-tools Area - AST tools labels Jan 6, 2025
Copy link
Contributor Author

overlookmotel commented Jan 6, 2025


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

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

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions github-actions bot added the C-performance Category - Solution not expected to change functional behavior, only performance label Jan 6, 2025
Copy link

codspeed-hq bot commented Jan 6, 2025

CodSpeed Performance Report

Merging #8298 will improve performances by 16.85%

Comparing 01-03-perf_span_align_span_same_as_usize_ (3fff7d2) with main (76ea52b)

Summary

⚡ 1 improvements
✅ 31 untouched benchmarks

Benchmarks breakdown

Benchmark main 01-03-perf_span_align_span_same_as_usize_ Change
lexer[RadixUIAdoptionSection.jsx] 23.8 µs 20.4 µs +16.85%

@overlookmotel overlookmotel marked this pull request as ready for review January 6, 2025 14:16
@overlookmotel overlookmotel marked this pull request as draft January 6, 2025 14:17
@overlookmotel overlookmotel force-pushed the 01-03-perf_span_align_span_same_as_usize_ branch from 2135503 to 1b5a978 Compare January 6, 2025 16:13
@overlookmotel overlookmotel force-pushed the 01-03-perf_span_align_span_same_as_usize_ branch from 1b5a978 to ec9d7e5 Compare January 17, 2025 21:41
@overlookmotel overlookmotel changed the base branch from main to 01-17-ci_benchmark_make_lexer_benchmark_more_realistic January 17, 2025 21:41
@overlookmotel overlookmotel marked this pull request as ready for review January 17, 2025 22:24
@overlookmotel
Copy link
Contributor Author

Weird. When I initially submitted this PR 2 weeks ago, it showed a 5% perf boost on isolated declarations benchmark, now it doesn't.

Still, +2% on codegen benchmark for a very small change ain't bad. The benchmarks showing negative result are noise due to allocations and hashmaps.

Copy link

graphite-app bot commented Jan 18, 2025

Merge activity

`Span` consists of 2 x `u32` (8 bytes total). Align `Span` on 8 bytes on 64-bit platforms. This means that, on 64-bit platforms, `Span` can be treated as equivalent to a `u64` and stored in a single register (instead of requiring 2).

A side-effect is that all AST structs also become aligned on 8. This will be a useful property later on as we can remove alignment calculations from `Allocator::alloc` (since everything now has same alignment).

`BooleanLiteral` (and `BoundaryAssertion`, `CharacterClassEscape` and `IndexedReference` from `oxc_regular_expression` crate) increase from 12 bytes to 16 bytes due to the higher alignment. But this makes no practical difference as they'd almost always end up with padding around them in arena anyway, as they'll be surrounded by 8-aligned types.
@Boshen Boshen force-pushed the 01-17-ci_benchmark_make_lexer_benchmark_more_realistic branch from c206be3 to bfd0b0d Compare January 18, 2025 01:47
@Boshen Boshen force-pushed the 01-03-perf_span_align_span_same_as_usize_ branch from ec9d7e5 to 3fff7d2 Compare January 18, 2025 01:47
Boshen pushed a commit that referenced this pull request Jan 18, 2025
#8298 made `Span` aligned on 8 on 64-bit platforms. Utilize this property to hash `Span` as a single `u64` instead of 2 x `u32`s. This reduces hashing a `Span` with `FxHash` to 3 instructions (down from 7), and 1 register (down from 3). https://godbolt.org/z/4q36xrWG8
Boshen pushed a commit that referenced this pull request Jan 18, 2025
#8298 made `Span` aligned on 8 on 64-bit platforms. Utilize this property to compare `Span`s as a single `u64` instead of 2 x `u32`s. This removes some really weird assembly which compiler otherwise produces, using expensive SIMD operations for a simple comparison: https://godbolt.org/z/sEf9MGvsr

Note: This only affects comparing `&Span`s. Makes no difference when comparing owned `Span`s.
Base automatically changed from 01-17-ci_benchmark_make_lexer_benchmark_more_realistic to main January 18, 2025 01:54
@graphite-app graphite-app bot merged commit 3fff7d2 into main Jan 18, 2025
26 checks passed
@graphite-app graphite-app bot deleted the 01-03-perf_span_align_span_same_as_usize_ branch January 18, 2025 02:01
Boshen added a commit that referenced this pull request Jan 18, 2025
## [0.47.0] - 2025-01-18

- fae4cd2 allocator: [**BREAKING**] Remove `Vec::into_string` (#8571)
(overlookmotel)

- 95bc0d7 allocator: [**BREAKING**] `Allocator` do not deref to
`bumpalo::Bump` (#8569) (overlookmotel)

- 19d3677 ast: [**BREAKING**] Always return
`Array<ImportDeclarationSpecifier>` for `ImportDeclaration.specifiers`
(#8560) (sapphi-red)

- 4ce6329 semantic: [**BREAKING**] Ensure program outlives semantic
(#8455) (Valentinas Janeiko)

- 7066d1c ast, span, syntax, regular_expression: [**BREAKING**] Remove
`ContentHash` (#8512) (overlookmotel)

### Features

- bf4e5e1 allocator: Add `HashMap` (#8553) (overlookmotel)
- a6d71f8 ast: Add `AstKind::ty` method (#8521) (overlookmotel)
- 4d4e805 minifier: Collapse if stmt with empty consequent (#8577)
(camc314)
- 991a22f minifier: Fold `Array::concat` into literal (#8442)
(sapphi-red)
- 3dc2d8b minifier: Fold string concat chaining (#8441) (sapphi-red)
- a4ae450 minifier: Fold array concat chaining (#8440) (sapphi-red)
- 7cc81ef minifier: Fold invalid typeof comparisons (#8550) (camc314)
- 927f43f minifier: Improve `.charCodeAt(arg)` when arg is valid (#8534)
(Boshen)
- 06f14d5 minifier: Remove empty class static block `class Foo { static
{} }` (#8525) (Boshen)
- 1860411 minifier: Remove last redundant return statement (#8523)
(Boshen)
- c479a58 napi/parser: Expose dynamic import expressions (#8540)
(Boshen)
- 2f0314e npm/oxc-minify: Npm package and publish script (#8579)
(Boshen)
- f413bb5 transformer/optional-chaining: Change parent scope for
expression when it wrapped with an arrow function (#8511) (Dunqing)

### Bug Fixes

- e87c001 allocator: Statically prevent memory leaks in allocator
(#8570) (overlookmotel)
- 855c839 codegen: Shorthand assignment target identifier consider
mangled names (#8536) (Boshen)
- 65c596d minifer: Keep idents if not in scope when minimizing array
exprs (#8551) (camc314)
- f57aac2 minifier: Incorrect folding of expr in bool ctx (#8542)
(camc314)
- 946ad76 minifier: `(-Infinity).toString()` -> `'-Infinity'` (#8535)
(Boshen)
- b1d0186 minifier: Do not fold `!!void b` (#8533) (Boshen)
- 53adde5 minifier: `x['-2147483648']` -> `x[-2147483648]` (#8528)
(Boshen)
- 405b73d minifier: Do not change `delete undefined` to `delete void 0`
(#8527) (Boshen)
- 92e44cb minifier: Do not remove `undefined` in `var x = undefined`
(#8526) (Boshen)
- 209e313 minifier: `class C { ['-1']() {} }` cannot be minifized
(#8516) (Boshen)
- 6585463 minifier: Always keep the last value of sequence expression
(#8490) (Boshen)
- b552f5c transformer: `wrap_in_arrow_function_iife` take span of input
`Expression` (#8547) (overlookmotel)
- 9963533 transformer/arrow-functions: Visit arguments to `super()` call
(#8494) (overlookmotel)
- 06ccb51 transformer/async-to-generator: Move parameters to the inner
generator function when they could throw errors (#8500) (Dunqing)
- 356f0c1 transformer/class-properties: Handle nested `super()` calls
(#8506) (overlookmotel)
- a048337 transformer/class-static-blocks: Static block converted to
IIFE use span of original block (#8549) (overlookmotel)

### Performance

- 76ea52b allocator: Inline `Box` methods (#8572) (overlookmotel)
- 93df57f allocator: `#[inline(always)]` methods of `Vec` which just
delegate to `allocator_api2` (#8567) (overlookmotel)
- 5a28d68 allocator: `#[inline(always)]` methods of `HashMap` which just
delegate to `hashbrown` (#8565) (overlookmotel)
- d17021c mangler: Optimize `base54` function (#8557) (overlookmotel)
- 6b52d7a mangler: Use a single allocation space for temporary vecs
(#8495) (Boshen)
- 30a869e semantic: Use `oxc_allocator::HashMap` in `ScopeTree` (#8554)
(overlookmotel)
- 63eb298 span: Compare `Span`s as single `u64`s (#8300) (overlookmotel)
- a43560c span: Hash `Span` as a single `u64` (#8299) (overlookmotel)
- 3fff7d2 span: Align `Span` same as `usize` (#8298) (overlookmotel)
- 53ef263 transformer/arrow-functions: Bail out of visiting early when
inserting `_this = this` after `super()` (#8482) (overlookmotel)

### Documentation

- fa1a6d5 allocator: Update docs for `Vec` (#8555) (overlookmotel)

### Refactor

- ac05134 allocator: `String` type (#8568) (overlookmotel)
- 68fab81 allocator: Rename inner `Vec` type (#8566) (overlookmotel)
- fcbca32 ast: Rename `#[estree(with)]` to `#[estree(via)]` (#8564)
(overlookmotel)
- 007e8c0 ast, regular_expression: Shorten `ContentEq` implementations
(#8519) (overlookmotel)
- b4c87e2 linter: Move DiagnosticsReporters to oxlint (#8454) (Alexander
S.)
- 8f57929 minifier: Merge `try_compress_type_of_equal_string` into
`try_minimize_binary` (#8561) (sapphi-red)
- 2857ae1 parser: Refactor visitor in regexp example (#8524)
(overlookmotel)
- b5ed58e span: All methods take owned `Span` (#8297) (overlookmotel)
- 712633f transformer: `wrap_statements_in_arrow_function_iife` utility
function (#8548) (overlookmotel)
- 5206c6a transformer: Rename `wrap_in_arrow_function_iife` (#8546)
(overlookmotel)
- 61077ca transformer: `wrap_arrow_function_iife` receive an owned
`Expression` (#8545) (overlookmotel)
- 6820d24 transformer: Move `wrap_arrow_function_iife` to root utils
module (#8529) (Dunqing)
- 52bd0b1 transformer: Move common utils functions to the root module
(#8513) (Dunqing)
- c30654a transformer/arrow-function: Wrapping arrow function iife by
using `wrap_arrow_function_iife` (#8530) (Dunqing)
- 2bc5175 transformer/arrow-functions: Rename method (#8481)
(overlookmotel)
- 72f425f transformer/class-properties: Fix lint warning in release mode
(#8539) (overlookmotel)
- 7e61b23 transformer/typescript: Shorten code (#8504) (overlookmotel)
- 04bc259 traverse: Remove unnecessary `#[allow]` (#8518)
(overlookmotel)
- a368726 traverse: Harden soundness of `Traverse` and document safety
invariants better (#8507) (overlookmotel)

### Testing

- e0f5d6c minifier: Update esbuild test (Boshen)
- 629c417 minifier: Port esbuild minification tests (#8497) (Boshen)

Co-authored-by: Boshen <[email protected]>
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-ast Area - AST A-ast-tools Area - AST tools 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.

1 participant