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(parser): reduce Token size from 16 to 12 bytes #2010

Merged

Conversation

Boshen
Copy link
Member

@Boshen Boshen commented Jan 13, 2024

I also had to change how the string for private identifiers are built, otherwise they will always be allocated.

@github-actions github-actions bot added the A-parser Area - Parser label Jan 13, 2024
Copy link
Member Author

Boshen commented Jan 13, 2024

Current dependencies on/for this PR:

This stack of pull requests is managed by Graphite.

@Boshen Boshen force-pushed the 01-13-perf_parser_reduce_Token_size_from_16_to_12_bytes branch from 1f1bde5 to 99d1179 Compare January 13, 2024 03:40
Copy link

codspeed-hq bot commented Jan 13, 2024

CodSpeed Performance Report

Merging #2010 will not alter performance

Comparing 01-13-perf_parser_reduce_Token_size_from_16_to_12_bytes (31a69cb) with main (6996948)

Summary

✅ 14 untouched benchmarks

@Boshen Boshen force-pushed the 01-13-perf_parser_reduce_Token_size_from_16_to_12_bytes branch from 99d1179 to 31a69cb Compare January 13, 2024 04:20
@Boshen Boshen merged commit 1886a5b into main Jan 13, 2024
18 checks passed
@Boshen Boshen deleted the 01-13-perf_parser_reduce_Token_size_from_16_to_12_bytes branch January 13, 2024 04:42
Boshen pushed a commit that referenced this pull request Jan 30, 2024
Counter-intuitively, it seems that *increasing* the size of `Token`
improves performance slightly.

This appears to be because when `Token` is 16 bytes, copying `Token` is
a single 16-byte load/store. At present, it's 12 bytes which requires an
8-byte load/store + a 4-byte load/store.

https://godbolt.org/z/KPYsn3ab7

This suggests that either:

1. #2010 could be reverted at no cost, and the overhead of the hash
table removed.
or:
2. We need to get `Token` down to 8 bytes!

I have an idea how to *maybe* do (2), so I'd suggest leaving it as is
for now until I've been able to research that.

NB I also tried putting `#[repr(align(16))]` on `Token` so that copying
uses aligned loads/stores. That [hurt the benchmarks very
slightly](https://codspeed.io/overlookmotel/oxc/branches/lexer-pad-token),
though it might produce a gain on architectures where unaligned loads
are more expensive (ARM64 I think?). But I can't test that theory, so
have left it out.
IWANABETHATGUY pushed a commit to IWANABETHATGUY/oxc that referenced this pull request May 29, 2024
I also had to change how the string for private identifiers are built,
otherwise they will always be allocated.
IWANABETHATGUY pushed a commit to IWANABETHATGUY/oxc that referenced this pull request May 29, 2024
Counter-intuitively, it seems that *increasing* the size of `Token`
improves performance slightly.

This appears to be because when `Token` is 16 bytes, copying `Token` is
a single 16-byte load/store. At present, it's 12 bytes which requires an
8-byte load/store + a 4-byte load/store.

https://godbolt.org/z/KPYsn3ab7

This suggests that either:

1. oxc-project#2010 could be reverted at no cost, and the overhead of the hash
table removed.
or:
2. We need to get `Token` down to 8 bytes!

I have an idea how to *maybe* do (2), so I'd suggest leaving it as is
for now until I've been able to research that.

NB I also tried putting `#[repr(align(16))]` on `Token` so that copying
uses aligned loads/stores. That [hurt the benchmarks very
slightly](https://codspeed.io/overlookmotel/oxc/branches/lexer-pad-token),
though it might produce a gain on architectures where unaligned loads
are more expensive (ARM64 I think?). But I can't test that theory, so
have left it out.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-parser Area - Parser
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant