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

[Merged by Bors] - Remove string-interner dependency and implement custom string Interner #2147

Closed
wants to merge 9 commits into from

Conversation

jedel1043
Copy link
Member

So, @raskad and myself had a short discussion about the state of #736, and we came to the conclusion that it would be a good time to implement our own string interner; partly because the string-interner crate is a bit unmaintained (as shown by Robbepop/string-interner#42 and Robbepop/string-interner#47), and partly because it would be hard to experiment with custom optimizations for UTF-16 strings. I still want to thank @Robbepop for the original implementation though, because some parts of this design have been shamelessly stolen from it 😅.

Having said that, this PR is a complete reimplementation of the interner, but with some modifications to (hopefully!) make it a bit easier to experiment with UTF-16 strings, apply optimizations, and whatnot :)

@jedel1043 jedel1043 added dependencies Pull requests that update a dependency file benchmark Issues and PRs related to the benchmark subsystem. rust Pull requests that update Rust code Internal Category for changelog labels Jun 28, 2022
@jedel1043 jedel1043 added this to the v0.16.0 milestone Jun 28, 2022
@jedel1043 jedel1043 added the run-benchmark Label used to run banchmarks on PRs label Jun 28, 2022
@jedel1043 jedel1043 removed the benchmark Issues and PRs related to the benchmark subsystem. label Jun 28, 2022
@github-actions
Copy link

github-actions bot commented Jun 28, 2022

Test262 conformance changes

VM implementation

Test result main count PR count difference
Total 90,663 90,663 0
Passed 58,166 58,166 0
Ignored 13,832 13,832 0
Failed 18,665 18,665 0
Panics 0 0 0
Conformance 64.16% 64.16% 0.00%

@codecov
Copy link

codecov bot commented Jun 28, 2022

Codecov Report

Merging #2147 (7c38715) into main (13df9a1) will increase coverage by 0.02%.
The diff coverage is 48.43%.

@@            Coverage Diff             @@
##             main    #2147      +/-   ##
==========================================
+ Coverage   42.68%   42.71%   +0.02%     
==========================================
  Files         222      225       +3     
  Lines       20763    20791      +28     
==========================================
+ Hits         8863     8881      +18     
- Misses      11900    11910      +10     
Impacted Files Coverage Δ
...src/syntax/ast/node/iteration/continue_node/mod.rs 50.00% <ø> (ø)
boa_engine/src/vm/code_block.rs 42.21% <ø> (ø)
boa_interner/src/sym.rs 0.00% <0.00%> (ø)
boa_interner/src/interned_str.rs 12.50% <12.50%> (ø)
boa_engine/src/object/mod.rs 20.91% <50.00%> (+0.54%) ⬆️
boa_interner/src/lib.rs 52.27% <53.12%> (+11.79%) ⬆️
boa_engine/src/builtins/function/mod.rs 26.11% <66.66%> (+0.68%) ⬆️
boa_interner/src/fixed_string.rs 80.00% <80.00%> (ø)
boa_engine/src/bytecompiler.rs 31.28% <100.00%> (-0.06%) ⬇️
boa_engine/src/syntax/ast/node/spread/mod.rs 57.14% <0.00%> (-14.29%) ⬇️
... and 27 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 13df9a1...7c38715. Read the comment docs.

@github-actions
Copy link

Benchmark for cb3dc61

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 711.2±26.80ns 717.7±31.39ns +0.91%
Arithmetic operations (Execution) 732.2±39.82ns 745.3±59.56ns +1.79%
Arithmetic operations (Parser) 7.5±1.23µs 7.5±0.75µs 0.00%
Array access (Compiler) 2.1±0.24µs 2.1±0.16µs 0.00%
Array access (Execution) 10.7±0.47µs 11.1±2.43µs +3.74%
Array access (Parser) 16.1±0.57µs 16.1±0.57µs 0.00%
Array creation (Compiler) 3.1±0.17µs 3.1±0.16µs 0.00%
Array creation (Execution) 3.2±0.13ms 3.2±0.15ms 0.00%
Array creation (Parser) 19.0±1.05µs 18.8±1.03µs -1.05%
Array pop (Compiler) 5.7±0.38µs 5.5±0.32µs -3.51%
Array pop (Execution) 1441.6±86.02µs 1450.6±97.26µs +0.62%
Array pop (Parser) 192.4±8.88µs 190.2±15.70µs -1.14%
Boolean Object Access (Compiler) 1536.7±106.02ns 1551.4±94.76ns +0.96%
Boolean Object Access (Execution) 5.7±0.33µs 5.6±0.27µs -1.75%
Boolean Object Access (Parser) 19.1±0.94µs 19.4±1.03µs +1.57%
Clean js (Compiler) 6.3±0.52µs 6.6±0.39µs +4.76%
Clean js (Execution) 907.2±51.56µs 905.7±45.50µs -0.17%
Clean js (Parser) 41.7±3.01µs 41.0±2.12µs -1.68%
Create Realm 288.6±11.83ns 289.8±22.10ns +0.42%
Dynamic Object Property Access (Compiler) 2.4±0.11µs 2.4±0.19µs 0.00%
Dynamic Object Property Access (Execution) 7.4±0.88µs 7.1±0.28µs -4.05%
Dynamic Object Property Access (Parser) 14.7±1.05µs 14.5±0.60µs -1.36%
Fibonacci (Compiler) 3.7±0.22µs 3.8±0.35µs +2.70%
Fibonacci (Execution) 1793.5±63.19µs 1807.8±125.91µs +0.80%
Fibonacci (Parser) 22.3±1.13µs 22.2±1.25µs -0.45%
For loop (Compiler) 3.5±0.22µs 3.5±0.21µs 0.00%
For loop (Execution) 23.3±1.09µs 23.7±1.35µs +1.72%
For loop (Parser) 19.4±1.01µs 19.3±1.19µs -0.52%
Mini js (Compiler) 5.7±0.77µs 5.9±0.62µs +3.51%
Mini js (Execution) 867.1±80.28µs 845.7±34.94µs -2.47%
Mini js (Parser) 36.1±2.73µs 35.8±2.63µs -0.83%
Number Object Access (Compiler) 1451.1±89.56ns 1452.7±95.77ns +0.11%
Number Object Access (Execution) 4.5±0.26µs 4.5±0.30µs 0.00%
Number Object Access (Parser) 14.9±0.78µs 15.1±0.59µs +1.34%
Object Creation (Compiler) 2.1±0.12µs 2.2±0.12µs +4.76%
Object Creation (Execution) 7.0±0.56µs 6.9±0.37µs -1.43%
Object Creation (Parser) 12.7±0.55µs 12.8±1.01µs +0.79%
RegExp (Compiler) 2.4±0.13µs 2.5±0.14µs +4.17%
RegExp (Execution) 16.1±0.99µs 16.4±1.38µs +1.86%
RegExp (Parser) 13.9±1.04µs 14.1±0.89µs +1.44%
RegExp Creation (Compiler) 2.2±0.42µs 2.2±0.11µs 0.00%
RegExp Creation (Execution) 11.6±0.48µs 11.8±1.16µs +1.72%
RegExp Creation (Parser) 12.3±2.67µs 11.8±0.68µs -4.07%
RegExp Literal (Compiler) 2.4±0.22µs 2.5±0.28µs +4.17%
RegExp Literal (Execution) 15.8±0.97µs 16.0±1.00µs +1.27%
RegExp Literal (Parser) 11.1±0.56µs 11.2±0.73µs +0.90%
RegExp Literal Creation (Compiler) 2.2±0.22µs 2.3±0.12µs +4.55%
RegExp Literal Creation (Execution) 11.6±0.67µs 11.8±0.69µs +1.72%
RegExp Literal Creation (Parser) 8.7±0.43µs 8.6±0.32µs -1.15%
Static Object Property Access (Compiler) 2.1±0.15µs 2.2±0.15µs +4.76%
Static Object Property Access (Execution) 7.3±0.52µs 7.0±0.53µs -4.11%
Static Object Property Access (Parser) 13.7±1.14µs 13.5±0.64µs -1.46%
String Object Access (Compiler) 1918.5±122.64ns 1914.8±120.45ns -0.19%
String Object Access (Execution) 8.2±0.33µs 8.4±0.72µs +2.44%
String Object Access (Parser) 19.0±1.03µs 19.4±2.29µs +2.11%
String comparison (Compiler) 3.1±0.21µs 3.2±0.16µs +3.23%
String comparison (Execution) 6.1±0.60µs 6.1±0.49µs 0.00%
String comparison (Parser) 14.7±0.62µs 14.8±0.77µs +0.68%
String concatenation (Compiler) 2.4±0.21µs 2.4±0.17µs 0.00%
String concatenation (Execution) 5.8±0.38µs 5.8±0.24µs 0.00%
String concatenation (Parser) 10.4±0.65µs 10.4±0.56µs 0.00%
String copy (Compiler) 1995.8±149.54ns 2.0±0.09µs +0.21%
String copy (Execution) 5.7±0.43µs 5.6±0.89µs -1.75%
String copy (Parser) 7.8±0.69µs 7.7±0.40µs -1.28%
Symbols (Compiler) 1528.3±94.21ns 1552.9±91.43ns +1.61%
Symbols (Execution) 5.7±0.33µs 5.8±0.49µs +1.75%
Symbols (Parser) 6.0±0.36µs 6.4±0.71µs +6.67%

@github-actions
Copy link

Benchmark for 234d628

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 544.6±0.67ns 548.6±6.98ns +0.73%
Arithmetic operations (Execution) 617.9±0.51ns 623.2±0.27ns +0.86%
Arithmetic operations (Parser) 5.8±0.00µs 5.9±0.01µs +1.72%
Array access (Compiler) 1461.5±2.72ns 1509.9±8.93ns +3.31%
Array access (Execution) 8.1±0.03µs 8.0±0.02µs -1.23%
Array access (Parser) 13.0±0.02µs 13.1±0.02µs +0.77%
Array creation (Compiler) 2.2±0.01µs 2.3±0.01µs +4.55%
Array creation (Execution) 2.7±0.00ms 2.7±0.00ms 0.00%
Array creation (Parser) 14.9±0.02µs 15.0±0.06µs +0.67%
Array pop (Compiler) 4.4±0.02µs 4.3±0.02µs -2.27%
Array pop (Execution) 1209.2±3.86µs 1189.4±3.06µs -1.64%
Array pop (Parser) 142.7±0.79µs 145.2±0.88µs +1.75%
Boolean Object Access (Compiler) 1158.2±2.55ns 1150.8±8.33ns -0.64%
Boolean Object Access (Execution) 4.3±0.02µs 4.3±0.01µs 0.00%
Boolean Object Access (Parser) 15.6±0.01µs 15.5±0.01µs -0.64%
Clean js (Compiler) 4.7±0.04µs 4.8±0.02µs +2.13%
Clean js (Execution) 713.5±3.81µs 712.2±3.77µs -0.18%
Clean js (Parser) 32.7±0.03µs 32.4±0.02µs -0.92%
Create Realm 229.1±0.21ns 230.7±3.40ns +0.70%
Dynamic Object Property Access (Compiler) 1719.3±6.17ns 1807.0±6.58ns +5.10%
Dynamic Object Property Access (Execution) 5.4±0.02µs 5.2±0.02µs -3.70%
Dynamic Object Property Access (Parser) 11.7±0.02µs 11.7±0.02µs 0.00%
Fibonacci (Compiler) 2.7±0.01µs 2.7±0.01µs 0.00%
Fibonacci (Execution) 1321.2±16.08µs 1297.1±1.39µs -1.82%
Fibonacci (Parser) 17.5±0.01µs 17.6±0.03µs +0.57%
For loop (Compiler) 2.5±0.02µs 2.6±0.02µs +4.00%
For loop (Execution) 16.2±0.07µs 15.7±0.03µs -3.09%
For loop (Parser) 15.5±0.03µs 15.2±0.04µs -1.94%
Mini js (Compiler) 4.1±0.02µs 4.2±0.03µs +2.44%
Mini js (Execution) 671.8±5.36µs 674.5±3.18µs +0.40%
Mini js (Parser) 28.5±0.72µs 28.2±0.03µs -1.05%
Number Object Access (Compiler) 1093.6±1.66ns 1090.9±7.01ns -0.25%
Number Object Access (Execution) 3.3±0.01µs 3.3±0.01µs 0.00%
Number Object Access (Parser) 12.1±0.06µs 12.2±0.02µs +0.83%
Object Creation (Compiler) 1524.4±4.90ns 1615.7±3.53ns +5.99%
Object Creation (Execution) 5.1±0.07µs 5.0±0.03µs -1.96%
Object Creation (Parser) 10.2±0.02µs 10.2±0.02µs 0.00%
RegExp (Compiler) 1710.7±2.85ns 1778.3±7.49ns +3.95%
RegExp (Execution) 11.9±0.08µs 11.9±0.04µs 0.00%
RegExp (Parser) 11.1±0.01µs 11.2±0.02µs +0.90%
RegExp Creation (Compiler) 1543.8±4.18ns 1611.2±3.73ns +4.37%
RegExp Creation (Execution) 8.9±0.05µs 8.9±0.03µs 0.00%
RegExp Creation (Parser) 9.3±0.02µs 9.4±0.01µs +1.08%
RegExp Literal (Compiler) 1715.2±3.50ns 1781.0±6.27ns +3.84%
RegExp Literal (Execution) 12.0±0.03µs 11.9±0.13µs -0.83%
RegExp Literal (Parser) 9.0±0.01µs 9.0±0.01µs 0.00%
RegExp Literal Creation (Compiler) 1543.0±5.97ns 1609.1±2.89ns +4.28%
RegExp Literal Creation (Execution) 8.9±0.04µs 8.8±0.04µs -1.12%
RegExp Literal Creation (Parser) 7.1±0.01µs 7.1±0.01µs 0.00%
Static Object Property Access (Compiler) 1534.2±6.32ns 1607.8±5.61ns +4.80%
Static Object Property Access (Execution) 5.2±0.12µs 5.1±0.04µs -1.92%
Static Object Property Access (Parser) 10.9±0.02µs 10.9±0.02µs 0.00%
String Object Access (Compiler) 1427.3±5.08ns 1426.3±4.64ns -0.07%
String Object Access (Execution) 6.2±0.03µs 6.6±0.06µs +6.45%
String Object Access (Parser) 15.3±0.02µs 15.1±0.02µs -1.31%
String comparison (Compiler) 2.3±0.01µs 2.3±0.01µs 0.00%
String comparison (Execution) 4.6±0.03µs 4.5±0.01µs -2.17%
String comparison (Parser) 12.0±0.01µs 11.8±0.01µs -1.67%
String concatenation (Compiler) 1735.6±5.04ns 1813.5±7.40ns +4.49%
String concatenation (Execution) 4.3±0.01µs 4.3±0.01µs 0.00%
String concatenation (Parser) 8.3±0.02µs 8.3±0.03µs 0.00%
String copy (Compiler) 1423.0±2.39ns 1459.6±4.83ns +2.57%
String copy (Execution) 4.1±0.03µs 4.0±0.02µs -2.44%
String copy (Parser) 6.3±0.01µs 6.2±0.01µs -1.59%
Symbols (Compiler) 1072.5±2.10ns 1085.5±5.99ns +1.21%
Symbols (Execution) 4.2±0.01µs 4.1±0.01µs -2.38%
Symbols (Parser) 4.9±0.01µs 4.8±0.02µs -2.04%

Copy link
Member

@Razican Razican left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good :) what are the main differences with the upstream implementation?

I just noticed that some documentation links are failing (give a look to the lints in GitHub, some are even in non-modified parts of the code).

boa_interner/src/interned_str.rs Outdated Show resolved Hide resolved
boa_interner/src/interned_str.rs Outdated Show resolved Hide resolved
boa_interner/src/sym.rs Outdated Show resolved Hide resolved
boa_interner/src/lib.rs Outdated Show resolved Hide resolved
boa_interner/src/lib.rs Outdated Show resolved Hide resolved
@jedel1043 jedel1043 requested a review from raskad June 28, 2022 16:54
@jedel1043
Copy link
Member Author

jedel1043 commented Jun 28, 2022

This looks good :) what are the main differences with the upstream implementation?

Essentially I've inlined the backend concept inside the Interner itself, which makes the implementation a lot simpler, I've changed the symbol cache to use FxHash instead of brownhash, which should be a bit more performant, but I think the most important change is that, since Interner can see our COMMON_STRINGS constant, it can generate Syms without having to offset them on creation by COMMON_STRINGS.len(). This simplifies a lot our logic.

However, I'm expecting the most important improvement will come with the implementation of Interner using UTF-8 and UTF-16 strings. We'll be able to use a Vec<u8> buffer to store all the strings instead of a double Interner for each type, which in consequence will reduce a lot our memory footprint.

@github-actions
Copy link

Benchmark for ef932a1

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 533.2±1.35ns 528.2±1.94ns -0.94%
Arithmetic operations (Execution) 502.5±0.42ns 506.5±10.35ns +0.80%
Arithmetic operations (Parser) 6.0±0.03µs 5.9±0.04µs -1.67%
Array access (Compiler) 1562.8±4.27ns 1578.2±4.46ns +0.99%
Array access (Execution) 8.7±0.03µs 8.6±0.04µs -1.15%
Array access (Parser) 14.0±0.05µs 13.6±0.15µs -2.86%
Array creation (Compiler) 2.4±0.01µs 2.6±0.01µs +8.33%
Array creation (Execution) 2.5±0.01ms 2.5±0.06ms 0.00%
Array creation (Parser) 16.0±0.04µs 15.6±0.07µs -2.50%
Array pop (Compiler) 4.3±0.02µs 4.4±0.03µs +2.33%
Array pop (Execution) 1183.7±3.07µs 1161.0±7.35µs -1.92%
Array pop (Parser) 152.6±1.23µs 148.9±0.22µs -2.42%
Boolean Object Access (Compiler) 1208.1±49.30ns 1221.2±3.81ns +1.08%
Boolean Object Access (Execution) 4.7±0.01µs 4.7±0.01µs 0.00%
Boolean Object Access (Parser) 16.6±0.10µs 16.2±0.22µs -2.41%
Clean js (Compiler) 5.1±0.03µs 5.1±0.02µs 0.00%
Clean js (Execution) 756.0±13.60µs 750.5±6.75µs -0.73%
Clean js (Parser) 34.7±0.11µs 33.8±0.08µs -2.59%
Create Realm 242.3±0.75ns 240.4±0.34ns -0.78%
Dynamic Object Property Access (Compiler) 1921.1±9.82ns 2.0±0.00µs +4.11%
Dynamic Object Property Access (Execution) 5.4±0.01µs 5.3±0.03µs -1.85%
Dynamic Object Property Access (Parser) 12.5±0.03µs 12.3±0.07µs -1.60%
Fibonacci (Compiler) 3.0±0.01µs 2.9±0.01µs -3.33%
Fibonacci (Execution) 1384.4±2.57µs 1416.9±2.99µs +2.35%
Fibonacci (Parser) 18.9±0.05µs 18.1±0.05µs -4.23%
For loop (Compiler) 2.8±0.01µs 2.8±0.01µs 0.00%
For loop (Execution) 15.9±0.33µs 16.5±0.09µs +3.77%
For loop (Parser) 16.5±0.08µs 16.0±0.43µs -3.03%
Mini js (Compiler) 4.6±0.01µs 4.5±0.01µs -2.17%
Mini js (Execution) 702.8±5.03µs 708.2±5.93µs +0.77%
Mini js (Parser) 30.3±0.06µs 29.4±0.05µs -2.97%
Number Object Access (Compiler) 1115.0±16.49ns 1181.7±2.86ns +5.98%
Number Object Access (Execution) 3.6±0.01µs 3.6±0.01µs 0.00%
Number Object Access (Parser) 12.9±0.06µs 12.5±0.09µs -3.10%
Object Creation (Compiler) 1616.1±3.95ns 1721.8±6.09ns +6.54%
Object Creation (Execution) 5.1±0.02µs 5.1±0.03µs 0.00%
Object Creation (Parser) 11.0±0.35µs 10.7±0.03µs -2.73%
RegExp (Compiler) 1878.7±23.94ns 1912.5±5.13ns +1.80%
RegExp (Execution) 12.2±0.04µs 12.2±0.04µs 0.00%
RegExp (Parser) 12.0±0.04µs 11.4±0.06µs -5.00%
RegExp Creation (Compiler) 1727.9±24.53ns 1714.1±49.54ns -0.80%
RegExp Creation (Execution) 9.1±0.09µs 9.2±0.04µs +1.10%
RegExp Creation (Parser) 10.0±0.05µs 9.5±0.03µs -5.00%
RegExp Literal (Compiler) 1914.3±10.10ns 1902.7±44.71ns -0.61%
RegExp Literal (Execution) 12.2±0.03µs 12.2±0.03µs 0.00%
RegExp Literal (Parser) 9.7±0.03µs 9.5±0.06µs -2.06%
RegExp Literal Creation (Compiler) 1732.1±16.38ns 1697.0±3.96ns -2.03%
RegExp Literal Creation (Execution) 9.1±0.03µs 9.2±0.03µs +1.10%
RegExp Literal Creation (Parser) 7.6±0.03µs 7.3±0.03µs -3.95%
Static Object Property Access (Compiler) 1676.9±100.41ns 1762.5±8.17ns +5.10%
Static Object Property Access (Execution) 5.3±0.02µs 5.3±0.01µs 0.00%
Static Object Property Access (Parser) 11.8±0.04µs 11.5±0.03µs -2.54%
String Object Access (Compiler) 1486.3±12.99ns 1593.6±4.22ns +7.22%
String Object Access (Execution) 6.4±0.02µs 6.4±0.02µs 0.00%
String Object Access (Parser) 16.4±0.03µs 15.8±0.11µs -3.66%
String comparison (Compiler) 2.5±0.01µs 2.5±0.10µs 0.00%
String comparison (Execution) 4.7±0.01µs 4.7±0.02µs 0.00%
String comparison (Parser) 12.8±0.06µs 12.5±0.04µs -2.34%
String concatenation (Compiler) 1879.9±11.41ns 1933.9±4.99ns +2.87%
String concatenation (Execution) 4.5±0.02µs 4.5±0.01µs 0.00%
String concatenation (Parser) 9.0±0.02µs 8.7±0.04µs -3.33%
String copy (Compiler) 1498.9±6.70ns 1567.4±5.89ns +4.57%
String copy (Execution) 4.2±0.01µs 4.2±0.02µs 0.00%
String copy (Parser) 6.9±0.02µs 6.6±0.07µs -4.35%
Symbols (Compiler) 1152.8±56.57ns 1102.6±2.32ns -4.35%
Symbols (Execution) 4.4±0.09µs 4.4±0.01µs 0.00%
Symbols (Parser) 5.3±0.01µs 5.0±0.07µs -5.66%

@github-actions
Copy link

Benchmark for b1f06a6

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 643.1±9.41ns 638.8±6.07ns -0.67%
Arithmetic operations (Execution) 743.0±19.57ns 750.0±6.99ns +0.94%
Arithmetic operations (Parser) 6.5±0.06µs 6.5±0.11µs 0.00%
Array access (Compiler) 1677.1±24.82ns 1698.4±18.56ns +1.27%
Array access (Execution) 9.6±0.15µs 9.5±0.15µs -1.04%
Array access (Parser) 14.2±0.19µs 14.2±0.78µs 0.00%
Array creation (Compiler) 2.6±0.03µs 2.6±0.03µs 0.00%
Array creation (Execution) 3.2±0.04ms 3.2±0.03ms 0.00%
Array creation (Parser) 16.5±0.16µs 16.1±0.21µs -2.42%
Array pop (Compiler) 5.2±0.07µs 5.0±0.05µs -3.85%
Array pop (Execution) 1414.9±19.60µs 1442.7±13.00µs +1.96%
Array pop (Parser) 159.7±1.88µs 163.9±1.06µs +2.63%
Boolean Object Access (Compiler) 1225.1±14.19ns 1210.7±13.77ns -1.18%
Boolean Object Access (Execution) 5.1±0.05µs 5.2±0.04µs +1.96%
Boolean Object Access (Parser) 17.1±0.22µs 17.0±0.20µs -0.58%
Clean js (Compiler) 5.5±0.06µs 5.5±0.06µs 0.00%
Clean js (Execution) 848.2±7.81µs 832.1±14.91µs -1.90%
Clean js (Parser) 35.6±0.37µs 35.2±0.29µs -1.12%
Create Realm 275.2±3.63ns 274.3±3.96ns -0.33%
Dynamic Object Property Access (Compiler) 1995.9±19.89ns 2.0±0.02µs +0.21%
Dynamic Object Property Access (Execution) 6.3±0.11µs 6.3±0.07µs 0.00%
Dynamic Object Property Access (Parser) 12.6±0.14µs 12.5±0.17µs -0.79%
Fibonacci (Compiler) 3.1±0.05µs 3.1±0.03µs 0.00%
Fibonacci (Execution) 1555.2±14.91µs 1531.6±8.12µs -1.52%
Fibonacci (Parser) 19.2±0.48µs 18.6±0.40µs -3.12%
For loop (Compiler) 3.0±0.05µs 2.9±0.04µs -3.33%
For loop (Execution) 19.1±0.33µs 18.9±0.23µs -1.05%
For loop (Parser) 16.8±0.29µs 16.6±0.27µs -1.19%
Mini js (Compiler) 4.9±0.06µs 4.8±0.05µs -2.04%
Mini js (Execution) 797.1±8.01µs 804.2±6.67µs +0.89%
Mini js (Parser) 30.4±0.42µs 30.4±0.30µs 0.00%
Number Object Access (Compiler) 1163.6±13.15ns 1164.5±11.15ns +0.08%
Number Object Access (Execution) 4.0±0.04µs 3.8±0.10µs -5.00%
Number Object Access (Parser) 13.4±0.17µs 13.3±0.25µs -0.75%
Object Creation (Compiler) 1773.2±24.96ns 1740.8±27.87ns -1.83%
Object Creation (Execution) 6.0±0.07µs 5.8±0.13µs -3.33%
Object Creation (Parser) 11.2±0.13µs 10.8±0.24µs -3.57%
RegExp (Compiler) 2.0±0.03µs 2.0±0.02µs 0.00%
RegExp (Execution) 13.7±0.38µs 14.1±0.19µs +2.92%
RegExp (Parser) 12.0±0.18µs 11.8±0.16µs -1.67%
RegExp Creation (Compiler) 1853.6±24.38ns 1786.8±13.72ns -3.60%
RegExp Creation (Execution) 10.4±0.11µs 10.6±0.16µs +1.92%
RegExp Creation (Parser) 10.1±0.18µs 9.9±0.14µs -1.98%
RegExp Literal (Compiler) 2.1±0.03µs 2.0±0.02µs -4.76%
RegExp Literal (Execution) 13.9±0.12µs 13.8±0.29µs -0.72%
RegExp Literal (Parser) 9.6±0.17µs 9.5±0.15µs -1.04%
RegExp Literal Creation (Compiler) 1853.5±28.61ns 1788.3±14.66ns -3.52%
RegExp Literal Creation (Execution) 10.5±0.12µs 10.7±0.13µs +1.90%
RegExp Literal Creation (Parser) 7.6±0.14µs 7.3±0.12µs -3.95%
Static Object Property Access (Compiler) 1789.7±25.65ns 1770.3±22.64ns -1.08%
Static Object Property Access (Execution) 6.2±0.08µs 6.1±0.08µs -1.61%
Static Object Property Access (Parser) 11.8±0.16µs 11.7±0.15µs -0.85%
String Object Access (Compiler) 1578.3±14.67ns 1590.4±8.48ns +0.77%
String Object Access (Execution) 7.3±0.05µs 7.5±0.08µs +2.74%
String Object Access (Parser) 16.8±0.26µs 16.5±0.25µs -1.79%
String comparison (Compiler) 2.6±0.03µs 2.6±0.04µs 0.00%
String comparison (Execution) 5.4±0.09µs 5.4±0.08µs 0.00%
String comparison (Parser) 12.9±0.19µs 12.8±0.22µs -0.78%
String concatenation (Compiler) 2.1±0.05µs 2.0±0.02µs -4.76%
String concatenation (Execution) 5.1±0.07µs 5.0±0.06µs -1.96%
String concatenation (Parser) 8.9±0.14µs 8.7±0.14µs -2.25%
String copy (Compiler) 1652.1±26.90ns 1651.5±16.96ns -0.04%
String copy (Execution) 4.9±0.04µs 4.8±0.07µs -2.04%
String copy (Parser) 6.7±0.11µs 6.5±0.14µs -2.99%
Symbols (Compiler) 1272.0±9.87ns 1206.4±25.16ns -5.16%
Symbols (Execution) 4.9±0.07µs 4.9±0.10µs 0.00%
Symbols (Parser) 5.2±0.09µs 5.0±0.12µs -3.85%

Copy link
Member

@raskad raskad left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very nice comments explaining how this works and also really good abstractions to make the behavior clear. Really good work :)

Copy link
Member

@Razican Razican left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great :) I noticed some things that could be potentially improved. Feel free to take them into account, and we can merge this :)

boa_engine/src/bytecompiler.rs Outdated Show resolved Hide resolved
boa_interner/src/lib.rs Show resolved Hide resolved
boa_interner/src/lib.rs Show resolved Hide resolved
boa_interner/src/lib.rs Outdated Show resolved Hide resolved
boa_interner/src/lib.rs Outdated Show resolved Hide resolved
boa_interner/src/lib.rs Outdated Show resolved Hide resolved
boa_interner/src/sym.rs Show resolved Hide resolved
boa_interner/src/sym.rs Outdated Show resolved Hide resolved
boa_interner/src/sym.rs Outdated Show resolved Hide resolved
boa_interner/src/sym.rs Outdated Show resolved Hide resolved
@github-actions
Copy link

Benchmark for a24b823

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 480.0±1.50ns 465.1±1.89ns -3.10%
Arithmetic operations (Execution) 547.8±0.91ns 551.6±1.23ns +0.69%
Arithmetic operations (Parser) 5.2±0.02µs 5.2±0.02µs 0.00%
Array access (Compiler) 1287.7±2.49ns 1256.9±2.00ns -2.39%
Array access (Execution) 7.2±0.02µs 8.1±0.05µs +12.50%
Array access (Parser) 11.5±0.04µs 13.1±0.01µs +13.91%
Array creation (Compiler) 1945.6±8.81ns 1931.9±8.45ns -0.70%
Array creation (Execution) 2.4±0.01ms 2.2±0.01ms -8.33%
Array creation (Parser) 13.2±0.06µs 13.4±0.04µs +1.52%
Array pop (Compiler) 3.8±0.01µs 3.6±0.01µs -5.26%
Array pop (Execution) 1203.4±9.48µs 992.4±4.99µs -17.53%
Array pop (Parser) 126.2±0.10µs 128.4±0.55µs +1.74%
Boolean Object Access (Compiler) 1022.3±4.85ns 1128.6±2.32ns +10.40%
Boolean Object Access (Execution) 3.9±0.01µs 3.7±0.01µs -5.13%
Boolean Object Access (Parser) 13.8±0.04µs 13.9±0.06µs +0.72%
Clean js (Compiler) 4.2±0.02µs 4.1±0.01µs -2.38%
Clean js (Execution) 628.8±4.20µs 620.9±3.85µs -1.26%
Clean js (Parser) 32.6±0.03µs 28.7±0.10µs -11.96%
Create Realm 276.8±0.30ns 229.8±0.39ns -16.98%
Dynamic Object Property Access (Compiler) 1511.0±6.36ns 1524.7±8.35ns +0.91%
Dynamic Object Property Access (Execution) 4.7±0.03µs 4.6±0.02µs -2.13%
Dynamic Object Property Access (Parser) 10.4±0.04µs 10.4±0.03µs 0.00%
Fibonacci (Compiler) 2.4±0.01µs 2.6±0.01µs +8.33%
Fibonacci (Execution) 1155.0±9.01µs 1154.7±4.15µs -0.03%
Fibonacci (Parser) 15.6±0.10µs 15.6±0.06µs 0.00%
For loop (Compiler) 2.2±0.01µs 2.2±0.01µs 0.00%
For loop (Execution) 14.2±0.07µs 15.6±0.01µs +9.86%
For loop (Parser) 13.8±0.04µs 13.5±0.06µs -2.17%
Mini js (Compiler) 3.7±0.02µs 4.0±0.01µs +8.11%
Mini js (Execution) 595.1±3.00µs 587.7±5.24µs -1.24%
Mini js (Parser) 25.0±0.06µs 24.9±0.10µs -0.40%
Number Object Access (Compiler) 966.0±4.26ns 1062.0±3.72ns +9.94%
Number Object Access (Execution) 3.0±0.01µs 2.9±0.01µs -3.33%
Number Object Access (Parser) 10.7±0.04µs 10.8±0.02µs +0.93%
Object Creation (Compiler) 1329.9±4.77ns 1355.0±6.42ns +1.89%
Object Creation (Execution) 4.4±0.03µs 4.5±0.22µs +2.27%
Object Creation (Parser) 9.1±0.04µs 9.0±0.04µs -1.10%
RegExp (Compiler) 1514.2±8.83ns 1499.9±5.77ns -0.94%
RegExp (Execution) 10.7±0.03µs 10.9±0.05µs +1.87%
RegExp (Parser) 9.9±0.02µs 10.0±0.02µs +1.01%
RegExp Creation (Compiler) 1383.4±4.18ns 1342.8±6.25ns -2.93%
RegExp Creation (Execution) 8.1±0.03µs 8.2±0.09µs +1.23%
RegExp Creation (Parser) 8.2±0.02µs 8.4±0.02µs +2.44%
RegExp Literal (Compiler) 1513.0±7.03ns 1501.6±6.94ns -0.75%
RegExp Literal (Execution) 10.7±0.04µs 10.9±0.04µs +1.87%
RegExp Literal (Parser) 7.9±0.02µs 9.1±0.02µs +15.19%
RegExp Literal Creation (Compiler) 1369.8±3.12ns 1344.7±6.12ns -1.83%
RegExp Literal Creation (Execution) 8.1±0.04µs 8.2±0.03µs +1.23%
RegExp Literal Creation (Parser) 6.2±0.01µs 6.3±0.03µs +1.61%
Static Object Property Access (Compiler) 1353.7±3.68ns 1384.9±7.51ns +2.30%
Static Object Property Access (Execution) 4.6±0.03µs 4.5±0.02µs -2.17%
Static Object Property Access (Parser) 9.7±0.02µs 9.7±0.03µs 0.00%
String Object Access (Compiler) 1270.0±4.65ns 1249.4±6.12ns -1.62%
String Object Access (Execution) 5.5±0.04µs 5.4±0.04µs -1.82%
String Object Access (Parser) 15.4±0.02µs 15.4±0.02µs 0.00%
String comparison (Compiler) 1957.1±6.77ns 1993.5±4.78ns +1.86%
String comparison (Execution) 4.0±0.02µs 3.9±0.02µs -2.50%
String comparison (Parser) 10.6±0.02µs 11.9±0.03µs +12.26%
String concatenation (Compiler) 1526.0±6.57ns 1545.3±4.43ns +1.26%
String concatenation (Execution) 3.8±0.02µs 3.7±0.02µs -2.63%
String concatenation (Parser) 7.4±0.03µs 7.3±0.04µs -1.35%
String copy (Compiler) 1246.8±6.82ns 1398.0±3.11ns +12.13%
String copy (Execution) 3.6±0.01µs 3.5±0.01µs -2.78%
String copy (Parser) 5.6±0.02µs 5.5±0.02µs -1.79%
Symbols (Compiler) 937.2±1.94ns 917.4±3.14ns -2.11%
Symbols (Execution) 3.7±0.02µs 4.1±0.01µs +10.81%
Symbols (Parser) 4.9±0.02µs 4.4±0.10µs -10.20%

@github-actions
Copy link

Benchmark for 75c2a77

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 531.7±1.13ns 533.5±1.65ns +0.34%
Arithmetic operations (Execution) 507.2±0.48ns 505.1±0.35ns -0.41%
Arithmetic operations (Parser) 6.0±0.01µs 6.0±0.04µs 0.00%
Array access (Compiler) 1545.6±5.03ns 1533.1±5.93ns -0.81%
Array access (Execution) 8.7±0.03µs 8.7±0.07µs 0.00%
Array access (Parser) 14.1±0.18µs 13.7±0.05µs -2.84%
Array creation (Compiler) 2.4±0.01µs 2.4±0.02µs 0.00%
Array creation (Execution) 2.5±0.01ms 2.4±0.07ms -4.00%
Array creation (Parser) 16.1±0.07µs 15.9±0.06µs -1.24%
Array pop (Compiler) 4.1±0.01µs 4.0±0.01µs -2.44%
Array pop (Execution) 1158.2±4.11µs 1132.3±4.29µs -2.24%
Array pop (Parser) 153.4±1.77µs 152.3±0.30µs -0.72%
Boolean Object Access (Compiler) 1202.9±9.27ns 1150.1±6.53ns -4.39%
Boolean Object Access (Execution) 4.8±0.07µs 4.7±0.02µs -2.08%
Boolean Object Access (Parser) 16.6±0.05µs 16.5±0.07µs -0.60%
Clean js (Compiler) 5.0±0.18µs 5.0±0.01µs 0.00%
Clean js (Execution) 745.9±4.68µs 741.5±4.32µs -0.59%
Clean js (Parser) 34.7±0.07µs 34.3±0.11µs -1.15%
Create Realm 233.1±2.75ns 236.2±0.18ns +1.33%
Dynamic Object Property Access (Compiler) 1848.8±5.57ns 1854.0±7.82ns +0.28%
Dynamic Object Property Access (Execution) 5.4±0.04µs 5.3±0.02µs -1.85%
Dynamic Object Property Access (Parser) 12.6±0.02µs 12.5±0.04µs -0.79%
Fibonacci (Compiler) 2.9±0.02µs 2.8±0.01µs -3.45%
Fibonacci (Execution) 1420.3±10.17µs 1387.1±2.41µs -2.34%
Fibonacci (Parser) 18.7±0.04µs 18.5±0.08µs -1.07%
For loop (Compiler) 2.7±0.01µs 2.7±0.01µs 0.00%
For loop (Execution) 15.9±0.08µs 15.9±0.08µs 0.00%
For loop (Parser) 16.4±0.06µs 16.3±0.14µs -0.61%
Mini js (Compiler) 4.5±0.02µs 4.4±0.01µs -2.22%
Mini js (Execution) 702.5±4.78µs 696.5±3.96µs -0.85%
Mini js (Parser) 30.2±0.03µs 29.8±0.04µs -1.32%
Number Object Access (Compiler) 1112.1±4.44ns 1074.7±3.00ns -3.36%
Number Object Access (Execution) 3.6±0.02µs 3.6±0.01µs 0.00%
Number Object Access (Parser) 13.0±0.03µs 12.9±0.03µs -0.77%
Object Creation (Compiler) 1615.5±5.35ns 1636.8±5.22ns +1.32%
Object Creation (Execution) 5.1±0.02µs 5.1±0.05µs 0.00%
Object Creation (Parser) 11.0±0.04µs 10.9±0.03µs -0.91%
RegExp (Compiler) 1837.7±36.89ns 1829.0±4.83ns -0.47%
RegExp (Execution) 12.1±0.09µs 12.3±0.04µs +1.65%
RegExp (Parser) 11.9±0.03µs 11.8±0.05µs -0.84%
RegExp Creation (Compiler) 1652.1±3.62ns 1651.2±3.11ns -0.05%
RegExp Creation (Execution) 9.2±0.04µs 9.2±0.03µs 0.00%
RegExp Creation (Parser) 9.9±0.03µs 9.8±0.28µs -1.01%
RegExp Literal (Compiler) 1820.6±6.33ns 1826.3±6.76ns +0.31%
RegExp Literal (Execution) 12.1±0.03µs 12.3±0.04µs +1.65%
RegExp Literal (Parser) 9.6±0.04µs 9.6±0.03µs 0.00%
RegExp Literal Creation (Compiler) 1659.2±3.80ns 1665.8±3.00ns +0.40%
RegExp Literal Creation (Execution) 9.2±0.03µs 9.2±0.04µs 0.00%
RegExp Literal Creation (Parser) 7.6±0.03µs 7.5±0.06µs -1.32%
Static Object Property Access (Compiler) 1660.7±22.03ns 1651.7±6.60ns -0.54%
Static Object Property Access (Execution) 5.3±0.02µs 5.2±0.01µs -1.89%
Static Object Property Access (Parser) 11.7±0.05µs 11.7±0.03µs 0.00%
String Object Access (Compiler) 1522.6±9.93ns 1497.8±12.06ns -1.63%
String Object Access (Execution) 6.5±0.02µs 6.6±0.01µs +1.54%
String Object Access (Parser) 16.4±0.04µs 16.2±0.04µs -1.22%
String comparison (Compiler) 2.4±0.01µs 2.5±0.01µs +4.17%
String comparison (Execution) 4.7±0.01µs 4.6±0.02µs -2.13%
String comparison (Parser) 12.7±0.03µs 12.6±0.05µs -0.79%
String concatenation (Compiler) 1808.8±5.26ns 1905.0±5.79ns +5.32%
String concatenation (Execution) 4.5±0.01µs 4.4±0.01µs -2.22%
String concatenation (Parser) 8.9±0.02µs 8.9±0.05µs 0.00%
String copy (Compiler) 1499.9±7.17ns 1547.5±5.78ns +3.17%
String copy (Execution) 4.2±0.01µs 4.1±0.02µs -2.38%
String copy (Parser) 6.9±0.06µs 6.8±0.03µs -1.45%
Symbols (Compiler) 1110.9±3.68ns 1107.3±2.65ns -0.32%
Symbols (Execution) 4.3±0.02µs 4.4±0.01µs +2.33%
Symbols (Parser) 5.2±0.06µs 5.2±0.06µs 0.00%

Copy link
Member

@Razican Razican left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good, still just a comment about safety in edge case scenarios.

boa_interner/src/lib.rs Outdated Show resolved Hide resolved
Copy link
Member

@Razican Razican left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great now :) it seems that boa_engine/src/builtins/function/mod.rs is giving a compile error due to Sym not implementing Trace. I guess the solution should be similar to Object.

@jedel1043
Copy link
Member Author

@Razican fixed!

@github-actions
Copy link

Benchmark for 86598bd

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 512.6±0.90ns 507.5±0.88ns -0.99%
Arithmetic operations (Execution) 500.9±0.29ns 499.1±0.47ns -0.36%
Arithmetic operations (Parser) 6.1±0.02µs 6.2±0.06µs +1.64%
Array access (Compiler) 1557.9±4.26ns 1558.7±7.92ns +0.05%
Array access (Execution) 8.6±0.03µs 8.7±0.03µs +1.16%
Array access (Parser) 14.1±0.02µs 13.9±0.04µs -1.42%
Array creation (Compiler) 2.4±0.03µs 2.4±0.02µs 0.00%
Array creation (Execution) 2.6±0.02ms 2.5±0.01ms -3.85%
Array creation (Parser) 16.4±0.02µs 16.2±0.05µs -1.22%
Array pop (Compiler) 4.1±0.02µs 4.1±0.02µs 0.00%
Array pop (Execution) 1160.9±4.98µs 1169.9±27.50µs +0.78%
Array pop (Parser) 155.2±0.21µs 155.6±0.17µs +0.26%
Boolean Object Access (Compiler) 1173.6±2.32ns 1185.9±10.23ns +1.05%
Boolean Object Access (Execution) 4.6±0.01µs 4.5±0.01µs -2.17%
Boolean Object Access (Parser) 17.0±0.07µs 16.5±0.06µs -2.94%
Clean js (Compiler) 5.0±0.01µs 5.1±0.01µs +2.00%
Clean js (Execution) 769.1±4.53µs 754.7±4.51µs -1.87%
Clean js (Parser) 35.3±0.07µs 34.8±0.17µs -1.42%
Create Realm 241.1±0.28ns 239.4±0.39ns -0.71%
Dynamic Object Property Access (Compiler) 1857.1±4.74ns 1862.3±5.20ns +0.28%
Dynamic Object Property Access (Execution) 5.4±0.02µs 5.3±0.04µs -1.85%
Dynamic Object Property Access (Parser) 12.7±0.03µs 12.4±0.05µs -2.36%
Fibonacci (Compiler) 2.9±0.01µs 2.8±0.01µs -3.45%
Fibonacci (Execution) 1420.5±2.74µs 1392.2±5.25µs -1.99%
Fibonacci (Parser) 19.1±0.05µs 18.8±0.04µs -1.57%
For loop (Compiler) 2.7±0.01µs 2.7±0.01µs 0.00%
For loop (Execution) 16.7±0.05µs 17.1±0.04µs +2.40%
For loop (Parser) 16.8±0.05µs 16.6±0.05µs -1.19%
Mini js (Compiler) 4.4±0.02µs 4.5±0.02µs +2.27%
Mini js (Execution) 712.8±11.05µs 701.9±8.32µs -1.53%
Mini js (Parser) 31.0±0.07µs 30.3±0.34µs -2.26%
Number Object Access (Compiler) 1086.7±3.14ns 1160.8±13.54ns +6.82%
Number Object Access (Execution) 3.5±0.05µs 3.5±0.02µs 0.00%
Number Object Access (Parser) 13.2±0.08µs 13.1±0.08µs -0.76%
Object Creation (Compiler) 1638.5±8.71ns 1666.3±12.39ns +1.70%
Object Creation (Execution) 5.2±0.01µs 5.1±0.03µs -1.92%
Object Creation (Parser) 11.1±0.02µs 10.8±0.04µs -2.70%
RegExp (Compiler) 1841.7±5.26ns 1835.3±8.81ns -0.35%
RegExp (Execution) 12.2±0.04µs 12.5±0.07µs +2.46%
RegExp (Parser) 12.4±0.04µs 11.9±0.04µs -4.03%
RegExp Creation (Compiler) 1669.7±4.71ns 1682.0±18.94ns +0.74%
RegExp Creation (Execution) 9.2±0.04µs 9.3±0.05µs +1.09%
RegExp Creation (Parser) 10.2±0.05µs 9.9±0.04µs -2.94%
RegExp Literal (Compiler) 1852.1±6.14ns 1837.0±17.10ns -0.82%
RegExp Literal (Execution) 12.2±0.05µs 12.6±0.07µs +3.28%
RegExp Literal (Parser) 10.0±0.02µs 9.7±0.04µs -3.00%
RegExp Literal Creation (Compiler) 1662.6±4.39ns 1667.3±16.10ns +0.28%
RegExp Literal Creation (Execution) 9.2±0.04µs 9.3±0.04µs +1.09%
RegExp Literal Creation (Parser) 7.8±0.01µs 7.7±0.03µs -1.28%
Static Object Property Access (Compiler) 1672.4±4.75ns 1686.5±8.69ns +0.84%
Static Object Property Access (Execution) 5.3±0.02µs 5.2±0.03µs -1.89%
Static Object Property Access (Parser) 11.9±0.02µs 11.6±0.03µs -2.52%
String Object Access (Compiler) 1456.3±5.59ns 1492.1±6.71ns +2.46%
String Object Access (Execution) 6.4±0.02µs 6.4±0.04µs 0.00%
String Object Access (Parser) 16.9±0.05µs 16.2±0.11µs -4.14%
String comparison (Compiler) 2.4±0.03µs 2.4±0.02µs 0.00%
String comparison (Execution) 4.7±0.01µs 4.7±0.03µs 0.00%
String comparison (Parser) 13.6±0.04µs 13.5±0.06µs -0.74%
String concatenation (Compiler) 1825.1±5.23ns 1818.9±15.04ns -0.34%
String concatenation (Execution) 4.4±0.04µs 4.4±0.03µs 0.00%
String concatenation (Parser) 9.2±0.03µs 9.2±0.04µs 0.00%
String copy (Compiler) 1507.8±4.45ns 1478.3±2.79ns -1.96%
String copy (Execution) 4.2±0.04µs 4.2±0.03µs 0.00%
String copy (Parser) 7.2±0.02µs 7.1±0.05µs -1.39%
Symbols (Compiler) 1143.4±8.04ns 1151.7±5.91ns +0.73%
Symbols (Execution) 4.5±0.01µs 4.5±0.02µs 0.00%
Symbols (Parser) 5.3±0.07µs 5.3±0.03µs 0.00%

@github-actions
Copy link

Benchmark for d1774c3

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 903.9±54.48ns 927.0±99.10ns +2.56%
Arithmetic operations (Execution) 865.0±47.31ns 866.3±49.08ns +0.15%
Arithmetic operations (Parser) 9.0±0.88µs 9.4±0.86µs +4.44%
Array access (Compiler) 2.7±0.21µs 2.5±0.23µs -7.41%
Array access (Execution) 13.8±0.96µs 13.9±2.10µs +0.72%
Array access (Parser) 20.3±1.29µs 19.6±1.83µs -3.45%
Array creation (Compiler) 3.8±0.25µs 3.8±0.29µs 0.00%
Array creation (Execution) 4.3±0.24ms 3.9±0.29ms -9.30%
Array creation (Parser) 23.8±2.43µs 25.2±2.83µs +5.88%
Array pop (Compiler) 6.6±0.64µs 6.8±0.66µs +3.03%
Array pop (Execution) 1827.0±106.13µs 1665.2±153.78µs -8.86%
Array pop (Parser) 223.6±28.22µs 228.4±19.94µs +2.15%
Boolean Object Access (Compiler) 1870.4±143.81ns 1918.5±190.64ns +2.57%
Boolean Object Access (Execution) 6.9±0.65µs 6.9±0.56µs 0.00%
Boolean Object Access (Parser) 26.5±3.87µs 24.7±2.26µs -6.79%
Clean js (Compiler) 8.3±0.70µs 8.5±1.51µs +2.41%
Clean js (Execution) 1167.4±155.06µs 1088.4±113.96µs -6.77%
Clean js (Parser) 55.3±5.72µs 53.9±7.53µs -2.53%
Create Realm 348.6±25.54ns 356.1±24.59ns +2.15%
Dynamic Object Property Access (Compiler) 3.0±0.34µs 2.9±0.23µs -3.33%
Dynamic Object Property Access (Execution) 9.4±0.59µs 9.4±0.76µs 0.00%
Dynamic Object Property Access (Parser) 19.2±1.54µs 18.3±1.50µs -4.69%
Fibonacci (Compiler) 4.6±0.60µs 4.5±0.36µs -2.17%
Fibonacci (Execution) 2.5±0.23ms 2.4±0.17ms -4.00%
Fibonacci (Parser) 27.9±1.97µs 27.5±1.90µs -1.43%
For loop (Compiler) 4.4±0.58µs 4.3±0.33µs -2.27%
For loop (Execution) 31.4±3.83µs 29.3±3.15µs -6.69%
For loop (Parser) 25.3±2.48µs 23.9±2.62µs -5.53%
Mini js (Compiler) 7.4±0.76µs 7.3±0.70µs -1.35%
Mini js (Execution) 1043.1±93.62µs 1057.2±89.72µs +1.35%
Mini js (Parser) 48.1±11.54µs 48.2±4.15µs +0.21%
Number Object Access (Compiler) 1861.3±162.70ns 1746.4±165.34ns -6.17%
Number Object Access (Execution) 5.4±0.41µs 5.6±0.44µs +3.70%
Number Object Access (Parser) 18.4±2.07µs 18.5±1.74µs +0.54%
Object Creation (Compiler) 2.6±0.70µs 2.7±0.26µs +3.85%
Object Creation (Execution) 9.0±1.11µs 8.7±0.92µs -3.33%
Object Creation (Parser) 16.6±1.97µs 15.1±1.98µs -9.04%
RegExp (Compiler) 2.8±0.29µs 3.1±0.28µs +10.71%
RegExp (Execution) 19.8±1.98µs 19.8±2.52µs 0.00%
RegExp (Parser) 17.1±1.19µs 16.8±1.31µs -1.75%
RegExp Creation (Compiler) 2.8±0.38µs 2.7±0.24µs -3.57%
RegExp Creation (Execution) 15.9±1.70µs 15.3±2.36µs -3.77%
RegExp Creation (Parser) 14.4±1.09µs 14.2±0.99µs -1.39%
RegExp Literal (Compiler) 2.9±0.24µs 3.0±0.29µs +3.45%
RegExp Literal (Execution) 20.2±2.05µs 21.0±2.86µs +3.96%
RegExp Literal (Parser) 14.2±2.33µs 14.0±1.99µs -1.41%
RegExp Literal Creation (Compiler) 2.6±0.26µs 2.7±0.26µs +3.85%
RegExp Literal Creation (Execution) 15.5±1.65µs 15.5±2.11µs 0.00%
RegExp Literal Creation (Parser) 11.4±1.00µs 11.2±1.15µs -1.75%
Static Object Property Access (Compiler) 2.6±0.21µs 2.7±0.22µs +3.85%
Static Object Property Access (Execution) 9.3±1.01µs 8.8±1.26µs -5.38%
Static Object Property Access (Parser) 18.1±1.36µs 16.3±1.22µs -9.94%
String Object Access (Compiler) 2.4±0.26µs 2.4±0.16µs 0.00%
String Object Access (Execution) 11.3±1.34µs 10.2±1.45µs -9.73%
String Object Access (Parser) 24.1±3.49µs 23.6±1.94µs -2.07%
String comparison (Compiler) 3.8±0.34µs 3.8±0.45µs 0.00%
String comparison (Execution) 7.5±0.74µs 7.5±0.74µs 0.00%
String comparison (Parser) 17.8±1.46µs 18.1±1.17µs +1.69%
String concatenation (Compiler) 2.8±0.28µs 3.0±0.38µs +7.14%
String concatenation (Execution) 7.4±0.51µs 7.3±0.73µs -1.35%
String concatenation (Parser) 13.0±1.09µs 12.6±0.92µs -3.08%
String copy (Compiler) 2.4±0.18µs 2.4±0.21µs 0.00%
String copy (Execution) 7.0±0.46µs 6.5±0.65µs -7.14%
String copy (Parser) 9.8±1.24µs 9.4±0.75µs -4.08%
Symbols (Compiler) 1840.1±265.47ns 1975.0±205.32ns +7.33%
Symbols (Execution) 7.3±0.92µs 7.5±0.72µs +2.74%
Symbols (Parser) 7.2±1.43µs 7.5±0.60µs +4.17%

@jedel1043
Copy link
Member Author

bors r+

bors bot pushed a commit that referenced this pull request Jun 30, 2022
…rner` (#2147)

So, @raskad and myself had a short discussion about the state of #736, and we came to the conclusion that it would be a good time to implement our own string interner; partly because the `string-interner` crate is a bit unmaintained (as shown by Robbepop/string-interner#42 and Robbepop/string-interner#47), and partly because it would be hard to experiment with custom optimizations for UTF-16 strings. I still want to thank @Robbepop for the original implementation though, because some parts of this design have been shamelessly stolen from it 😅.

Having said that, this PR is a complete reimplementation of the interner, but with some modifications to (hopefully!) make it a bit easier to experiment with UTF-16 strings, apply optimizations, and whatnot :)
@bors
Copy link

bors bot commented Jun 30, 2022

Pull request successfully merged into main.

Build succeeded:

@bors bors bot changed the title Remove string-interner dependency and implement custom string Interner [Merged by Bors] - Remove string-interner dependency and implement custom string Interner Jun 30, 2022
@bors bors bot closed this Jun 30, 2022
@bors bors bot deleted the custom-interner branch June 30, 2022 15:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file Internal Category for changelog run-benchmark Label used to run banchmarks on PRs rust Pull requests that update Rust code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants