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

Constant JsStrings #1435

Merged
merged 2 commits into from
Aug 28, 2021
Merged

Constant JsStrings #1435

merged 2 commits into from
Aug 28, 2021

Conversation

HalidOdat
Copy link
Member

Every time we call .get("length", context) (and we do this a lot), this is bad for two reasons a new JsString is allocated every time, we do not utilize the Rc nature of JsString ref count and comparisons between to same JsString that point to the same memory is just a pointer compare.

@HalidOdat HalidOdat added performance Performance related changes and issues execution Issues or PRs related to code execution labels Jul 27, 2021
@HalidOdat HalidOdat added this to the v0.13.0 milestone Jul 27, 2021
@github-actions
Copy link

github-actions bot commented Jul 27, 2021

Test262 conformance changes:

Test result master count PR count difference
Total 80,685 80,685 0
Passed 32,365 32,365 0
Ignored 15,818 15,818 0
Failed 32,502 32,502 0
Panics 0 0 0
Conformance 40.11% 40.11% 0.00%

@github-actions
Copy link

Benchmark for afdfe14

Click to view benchmark
Test PR Benchmark Master Benchmark %
Arithmetic operations (Execution) 264.5±10.06ns 257.1±7.12ns +2.88%
Arithmetic operations (Full) 272.3±8.21µs 300.8±9.55µs -9.47%
Array access (Execution) 6.3±0.37µs 6.7±0.27µs -5.97%
Array access (Full) 299.3±7.78µs 329.7±17.30µs -9.22%
Array creation (Execution) 2.7±0.09ms 2.5±0.08ms +8.00%
Array creation (Full) 2.9±0.09ms 2.9±0.07ms 0.00%
Array pop (Execution) 837.6±25.74µs 802.9±35.07µs +4.32%
Array pop (Full) 1291.4±35.91µs 1338.2±50.00µs -3.50%
Boolean Object Access (Execution) 5.5±0.29µs 5.6±0.20µs -1.79%
Boolean Object Access (Full) 291.8±5.95µs 316.4±8.82µs -7.77%
Clean js (Execution) 714.3±21.64µs 724.9±27.18µs -1.46%
Clean js (Full) 999.6±32.82µs 1101.2±60.76µs -9.23%
Clean js (Parser) 41.0±1.29µs 40.2±1.23µs +1.99%
Create Realm 410.0±11.75ns 404.1±17.84ns +1.46%
Dynamic Object Property Access (Execution) 5.3±0.27µs 5.3±0.22µs 0.00%
Dynamic Object Property Access (Full) 298.1±8.45µs 323.9±13.04µs -7.97%
Expression (Parser) 6.9±0.28µs 6.8±0.24µs +1.47%
Fibonacci (Execution) 779.6±43.58µs 785.2±29.21µs -0.71%
Fibonacci (Full) 1100.5±46.06µs 1174.1±31.62µs -6.27%
For loop (Execution) 21.1±0.65µs 20.8±0.85µs +1.44%
For loop (Full) 305.3±9.82µs 333.7±16.78µs -8.51%
For loop (Parser) 19.5±1.81µs 19.2±0.84µs +1.56%
Goal Symbols (Parser) 14.5±0.44µs 13.6±0.46µs +6.62%
Hello World (Parser) 3.9±0.17µs 3.7±0.14µs +5.41%
Long file (Parser) 783.6±18.02ns 784.7±22.91ns -0.14%
Mini js (Execution) 635.6±18.37µs 649.8±22.64µs -2.19%
Mini js (Full) 923.6±18.20µs 1029.5±88.35µs -10.29%
Mini js (Parser) 35.2±1.05µs 35.5±1.37µs -0.85%
Number Object Access (Execution) 4.3±0.14µs 4.5±0.20µs -4.44%
Number Object Access (Full) 285.7±7.34µs 315.9±13.37µs -9.56%
Object Creation (Execution) 4.5±0.14µs 4.5±0.21µs 0.00%
Object Creation (Full) 297.0±11.94µs 318.1±12.85µs -6.63%
RegExp (Execution) 13.3±0.60µs 12.8±0.74µs +3.91%
RegExp (Full) 310.3±12.17µs 329.7±19.36µs -5.88%
RegExp Literal (Execution) 12.9±0.52µs 13.7±0.82µs -5.84%
RegExp Literal (Full) 311.3±15.51µs 331.0±7.00µs -5.95%
RegExp Literal Creation (Execution) 9.7±0.34µs 9.3±0.39µs +4.30%
RegExp Literal Creation (Full) 305.6±11.15µs 324.4±9.66µs -5.80%
Static Object Property Access (Execution) 4.6±0.14µs 4.7±0.23µs -2.13%
Static Object Property Access (Full) 294.0±10.25µs 319.0±9.86µs -7.84%
String Object Access (Execution) 6.7±0.26µs 7.6±0.38µs -11.84%
String Object Access (Full) 295.9±10.91µs 318.2±10.59µs -7.01%
String comparison (Execution) 5.8±0.17µs 6.8±0.33µs -14.71%
String comparison (Full) 308.3±14.31µs 325.4±8.93µs -5.26%
String concatenation (Execution) 4.7±0.29µs 5.4±0.27µs -12.96%
String concatenation (Full) 291.8±10.87µs 314.9±9.01µs -7.34%
String copy (Execution) 3.8±0.12µs 4.2±0.12µs -9.52%
String copy (Full) 284.9±7.22µs 310.6±7.76µs -8.27%
Symbols (Execution) 3.4±0.12µs 3.4±0.15µs 0.00%
Symbols (Full) 266.8±8.35µs 290.0±10.13µs -8.00%

@github-actions
Copy link

Benchmark for 24ba371

Click to view benchmark
Test PR Benchmark Master Benchmark %
Arithmetic operations (Execution) 274.9±0.39ns 277.1±6.13ns -0.79%
Arithmetic operations (Full) 272.6±0.76µs 275.5±5.19µs -1.05%
Array access (Execution) 6.0±0.10µs 6.1±0.16µs -1.64%
Array access (Full) 296.6±1.06µs 300.3±5.94µs -1.23%
Array creation (Execution) 2.7±0.01ms 2.7±0.07ms 0.00%
Array creation (Full) 3.1±0.01ms 3.0±0.06ms +3.33%
Array pop (Execution) 843.4±4.17µs 872.5±20.03µs -3.34%
Array pop (Full) 1344.8±11.81µs 1341.6±25.14µs +0.24%
Boolean Object Access (Execution) 4.7±0.01µs 5.4±0.12µs -12.96%
Boolean Object Access (Full) 292.3±0.52µs 292.4±6.70µs -0.03%
Clean js (Execution) 675.6±3.29µs 709.2±13.60µs -4.74%
Clean js (Full) 1008.0±6.46µs 1025.8±26.63µs -1.74%
Clean js (Parser) 39.6±0.15µs 37.9±0.87µs +4.49%
Create Realm 439.1±2.24ns 418.5±12.63ns +4.92%
Dynamic Object Property Access (Execution) 4.9±0.02µs 5.0±0.14µs -2.00%
Dynamic Object Property Access (Full) 292.5±3.31µs 306.0±1.14µs -4.41%
Expression (Parser) 6.9±0.02µs 6.7±0.25µs +2.99%
Fibonacci (Execution) 730.6±0.61µs 740.0±17.72µs -1.27%
Fibonacci (Full) 1053.7±3.57µs 1086.1±25.33µs -2.98%
For loop (Execution) 20.5±0.08µs 20.4±0.60µs +0.49%
For loop (Full) 306.1±0.90µs 305.1±6.53µs +0.33%
For loop (Parser) 19.2±0.05µs 18.4±0.55µs +4.35%
Goal Symbols (Parser) 14.1±0.14µs 13.2±0.30µs +6.82%
Hello World (Parser) 3.9±0.15µs 3.6±0.08µs +8.33%
Long file (Parser) 803.6±3.11ns 793.0±13.09ns +1.34%
Mini js (Execution) 610.8±5.11µs 649.0±16.18µs -5.89%
Mini js (Full) 941.1±4.45µs 963.8±17.76µs -2.36%
Mini js (Parser) 33.8±1.12µs 33.1±0.70µs +2.11%
Number Object Access (Execution) 3.7±0.01µs 4.3±0.08µs -13.95%
Number Object Access (Full) 287.2±1.69µs 284.4±6.31µs +0.98%
Object Creation (Execution) 4.2±0.02µs 4.5±0.11µs -6.67%
Object Creation (Full) 290.8±1.31µs 299.7±1.41µs -2.97%
RegExp (Execution) 12.5±0.05µs 13.7±0.17µs -8.76%
RegExp (Full) 301.0±1.27µs 297.2±5.54µs +1.28%
RegExp Literal (Execution) 12.6±0.06µs 13.2±0.35µs -4.55%
RegExp Literal (Full) 305.0±1.24µs 305.9±6.64µs -0.29%
RegExp Literal Creation (Execution) 9.6±0.03µs 9.9±0.19µs -3.03%
RegExp Literal Creation (Full) 296.8±0.84µs 295.6±5.70µs +0.41%
Static Object Property Access (Execution) 4.3±0.01µs 4.6±0.14µs -6.52%
Static Object Property Access (Full) 291.1±1.31µs 303.0±0.44µs -3.93%
String Object Access (Execution) 6.1±0.01µs 7.1±0.11µs -14.08%
String Object Access (Full) 294.5±0.91µs 295.8±6.59µs -0.44%
String comparison (Execution) 5.5±0.04µs 6.3±0.16µs -12.70%
String comparison (Full) 297.4±3.80µs 301.1±4.52µs -1.23%
String concatenation (Execution) 4.5±0.19µs 5.1±0.14µs -11.76%
String concatenation (Full) 287.5±3.48µs 288.1±5.37µs -0.21%
String copy (Execution) 3.6±0.02µs 3.9±0.12µs -7.69%
String copy (Full) 285.2±4.64µs 281.6±5.96µs +1.28%
Symbols (Execution) 3.2±0.02µs 3.3±0.09µs -3.03%
Symbols (Full) 267.3±1.44µs 269.7±4.82µs -0.89%

@HalidOdat
Copy link
Member Author

I'll try to rebase this too :)

@HalidOdat HalidOdat changed the title Constant JsStrings and make environments take JsString Constant JsStrings Aug 24, 2021
@github-actions
Copy link

Benchmark for f457f6a

Click to view benchmark
Test PR Benchmark Master Benchmark %
Arithmetic operations (Execution) 272.4±22.18ns 257.1±6.25ns +5.95%
Arithmetic operations (Full) 320.2±10.58µs 336.4±12.78µs -4.82%
Array access (Execution) 7.2±0.19µs 8.2±0.31µs -12.20%
Array access (Full) 352.1±15.41µs 366.1±15.28µs -3.82%
Array creation (Execution) 2.9±0.10ms 2.9±0.13ms 0.00%
Array creation (Full) 3.2±0.08ms 3.3±0.13ms -3.03%
Array pop (Execution) 943.2±28.84µs 966.0±22.59µs -2.36%
Array pop (Full) 1461.1±60.37µs 1486.1±58.46µs -1.68%
Boolean Object Access (Execution) 5.7±0.19µs 6.0±0.11µs -5.00%
Boolean Object Access (Full) 342.5±12.96µs 358.3±11.35µs -4.41%
Clean js (Execution) 767.1±25.11µs 773.7±19.31µs -0.85%
Clean js (Full) 1126.9±26.39µs 1153.5±37.25µs -2.31%
Clean js (Parser) 37.5±2.42µs 37.2±1.76µs +0.81%
Create Realm 419.6±13.17ns 431.8±14.49ns -2.83%
Dynamic Object Property Access (Execution) 5.7±0.11µs 6.1±0.17µs -6.56%
Dynamic Object Property Access (Full) 347.0±8.74µs 369.9±23.64µs -6.19%
Expression (Parser) 6.2±0.21µs 6.2±0.17µs 0.00%
Fibonacci (Execution) 893.6±16.63µs 964.3±32.23µs -7.33%
Fibonacci (Full) 1228.2±57.87µs 1250.2±36.49µs -1.76%
For loop (Execution) 21.7±0.56µs 22.2±0.90µs -2.25%
For loop (Full) 352.6±10.68µs 371.5±20.27µs -5.09%
For loop (Parser) 17.5±0.48µs 17.7±1.16µs -1.13%
Goal Symbols (Parser) 12.8±0.43µs 12.7±0.52µs +0.79%
Hello World (Parser) 3.6±0.10µs 3.6±0.11µs 0.00%
Long file (Parser) 828.9±33.04ns 813.8±20.99ns +1.86%
Mini js (Execution) 685.9±16.81µs 695.1±14.53µs -1.32%
Mini js (Full) 1066.2±89.51µs 1080.3±31.84µs -1.31%
Mini js (Parser) 32.5±1.18µs 32.8±1.78µs -0.91%
Number Object Access (Execution) 4.4±0.17µs 4.7±0.17µs -6.38%
Number Object Access (Full) 339.4±9.79µs 357.6±34.81µs -5.09%
Object Creation (Execution) 5.0±0.13µs 5.5±0.20µs -9.09%
Object Creation (Full) 346.1±13.37µs 359.0±11.92µs -3.59%
RegExp (Execution) 13.7±0.51µs 14.9±0.61µs -8.05%
RegExp (Full) 352.9±7.50µs 368.4±20.23µs -4.21%
RegExp Literal (Execution) 13.7±0.55µs 14.9±0.58µs -8.05%
RegExp Literal (Full) 379.7±61.24µs 380.4±10.08µs -0.18%
RegExp Literal Creation (Execution) 9.9±0.21µs 10.7±0.37µs -7.48%
RegExp Literal Creation (Full) 352.2±22.43µs 362.3±8.77µs -2.79%
Static Object Property Access (Execution) 5.3±0.19µs 5.7±0.21µs -7.02%
Static Object Property Access (Full) 344.9±9.96µs 367.2±30.52µs -6.07%
String Object Access (Execution) 7.6±0.28µs 8.0±0.25µs -5.00%
String Object Access (Full) 350.4±21.08µs 362.1±15.26µs -3.23%
String comparison (Execution) 7.2±0.22µs 7.8±0.24µs -7.69%
String comparison (Full) 361.6±40.83µs 358.0±7.99µs +1.01%
String concatenation (Execution) 5.7±0.14µs 6.3±0.27µs -9.52%
String concatenation (Full) 344.7±12.72µs 354.6±11.46µs -2.79%
String copy (Execution) 4.6±0.11µs 4.9±0.11µs -6.12%
String copy (Full) 337.1±10.53µs 351.8±14.36µs -4.18%
Symbols (Execution) 3.8±0.15µs 4.1±0.09µs -7.32%
Symbols (Full) 313.9±9.02µs 331.1±11.60µs -5.19%

@Razican
Copy link
Member

Razican commented Aug 25, 2021

This is definitely a good step, but at some point we should intern all this in an interner in Context. It would be much more efficient.

@HalidOdat HalidOdat marked this pull request as ready for review August 28, 2021 13:41
@HalidOdat HalidOdat merged commit 25efd22 into master Aug 28, 2021
@HalidOdat HalidOdat deleted the constant-strings branch August 28, 2021 15:03
@github-actions
Copy link

Benchmark for e196f53

Click to view benchmark
Test PR Benchmark Master Benchmark %
Arithmetic operations (Execution) 279.3±15.36ns 294.1±31.70ns -5.03%
Arithmetic operations (Full) 316.6±36.55µs 340.4±18.10µs -6.99%
Array access (Execution) 7.6±0.37µs 7.8±0.66µs -2.56%
Array access (Full) 353.6±30.87µs 381.0±41.88µs -7.19%
Array creation (Execution) 3.1±0.11ms 3.1±0.17ms 0.00%
Array creation (Full) 3.5±0.20ms 3.4±0.14ms +2.94%
Array pop (Execution) 1004.2±314.58µs 1008.3±47.53µs -0.41%
Array pop (Full) 1526.8±95.26µs 1541.1±80.43µs -0.93%
Boolean Object Access (Execution) 5.6±0.27µs 5.9±0.59µs -5.08%
Boolean Object Access (Full) 338.8±26.16µs 367.2±40.64µs -7.73%
Clean js (Execution) 793.6±29.27µs 803.3±33.30µs -1.21%
Clean js (Full) 1161.1±69.84µs 1198.8±70.75µs -3.14%
Clean js (Parser) 38.9±2.21µs 37.8±2.07µs +2.91%
Create Realm 453.7±38.32ns 452.7±23.46ns +0.22%
Dynamic Object Property Access (Execution) 5.8±0.33µs 6.1±0.37µs -4.92%
Dynamic Object Property Access (Full) 346.7±22.15µs 375.1±102.09µs -7.57%
Expression (Parser) 6.6±0.96µs 6.4±0.37µs +3.12%
Fibonacci (Execution) 930.4±64.80µs 954.2±59.72µs -2.49%
Fibonacci (Full) 1251.4±77.97µs 1294.1±105.80µs -3.30%
For loop (Execution) 22.3±1.28µs 22.5±1.09µs -0.89%
For loop (Full) 352.4±19.64µs 382.4±35.35µs -7.85%
For loop (Parser) 18.2±2.20µs 18.1±1.17µs +0.55%
Goal Symbols (Parser) 12.9±0.56µs 13.2±0.73µs -2.27%
Hello World (Parser) 3.7±0.33µs 3.7±0.20µs 0.00%
Long file (Parser) 852.4±155.75ns 827.5±50.58ns +3.01%
Mini js (Execution) 722.1±33.30µs 748.9±40.53µs -3.58%
Mini js (Full) 1119.9±72.07µs 1135.6±64.68µs -1.38%
Mini js (Parser) 34.1±1.41µs 33.3±2.54µs +2.40%
Number Object Access (Execution) 4.4±0.18µs 4.6±0.41µs -4.35%
Number Object Access (Full) 333.7±21.91µs 369.1±49.00µs -9.59%
Object Creation (Execution) 5.1±0.24µs 5.4±0.43µs -5.56%
Object Creation (Full) 344.8±31.42µs 361.5±16.04µs -4.62%
RegExp (Execution) 14.4±0.79µs 14.7±1.15µs -2.04%
RegExp (Full) 349.0±21.67µs 382.6±27.73µs -8.78%
RegExp Literal (Execution) 14.8±1.29µs 14.7±0.95µs +0.68%
RegExp Literal (Full) 361.1±31.44µs 387.6±42.54µs -6.84%
RegExp Literal Creation (Execution) 10.3±0.68µs 10.6±0.64µs -2.83%
RegExp Literal Creation (Full) 344.6±32.04µs 367.7±21.15µs -6.28%
Static Object Property Access (Execution) 5.5±0.23µs 5.6±0.27µs -1.79%
Static Object Property Access (Full) 343.8±16.21µs 366.2±19.17µs -6.12%
String Object Access (Execution) 8.3±0.40µs 8.5±0.73µs -2.35%
String Object Access (Full) 346.4±29.22µs 371.8±33.01µs -6.83%
String comparison (Execution) 7.4±0.53µs 7.4±0.38µs 0.00%
String comparison (Full) 347.1±35.31µs 369.5±16.08µs -6.06%
String concatenation (Execution) 5.9±0.46µs 6.0±0.34µs -1.67%
String concatenation (Full) 335.2±18.79µs 360.4±29.77µs -6.99%
String copy (Execution) 4.5±0.24µs 4.7±0.26µs -4.26%
String copy (Full) 330.5±25.53µs 351.1±17.63µs -5.87%
Symbols (Execution) 3.8±0.27µs 3.9±0.20µs -2.56%
Symbols (Full) 309.5±13.53µs 342.4±26.15µs -9.61%

@github-actions
Copy link

Benchmark for 7421cc4

Click to view benchmark
Test PR Benchmark Master Benchmark %
Arithmetic operations (Execution) 300.7±22.25ns 270.2±21.91ns +11.29%
Arithmetic operations (Full) 323.1±23.20µs 351.3±22.48µs -8.03%
Array access (Execution) 7.8±0.33µs 7.7±0.44µs +1.30%
Array access (Full) 352.3±26.46µs 375.5±21.85µs -6.18%
Array creation (Execution) 3.3±0.22ms 3.1±0.20ms +6.45%
Array creation (Full) 3.5±0.18ms 3.4±0.20ms +2.94%
Array pop (Execution) 1060.7±92.81µs 997.3±72.50µs +6.36%
Array pop (Full) 1584.1±91.25µs 1561.0±116.83µs +1.48%
Boolean Object Access (Execution) 5.4±0.44µs 5.7±0.37µs -5.26%
Boolean Object Access (Full) 343.7±18.80µs 359.8±22.45µs -4.47%
Clean js (Execution) 759.8±53.68µs 782.0±55.75µs -2.84%
Clean js (Full) 1195.5±94.01µs 1200.6±83.55µs -0.42%
Clean js (Parser) 38.3±2.30µs 38.3±2.94µs 0.00%
Create Realm 474.7±27.85ns 443.2±34.36ns +7.11%
Dynamic Object Property Access (Execution) 6.0±0.41µs 5.9±0.34µs +1.69%
Dynamic Object Property Access (Full) 363.9±19.58µs 364.8±25.66µs -0.25%
Expression (Parser) 6.5±0.30µs 6.6±0.46µs -1.52%
Fibonacci (Execution) 940.1±45.89µs 958.1±63.76µs -1.88%
Fibonacci (Full) 1228.5±81.20µs 1316.2±91.67µs -6.66%
For loop (Execution) 23.6±1.71µs 22.2±1.62µs +6.31%
For loop (Full) 355.6±24.69µs 384.8±30.06µs -7.59%
For loop (Parser) 18.5±1.21µs 18.0±1.12µs +2.78%
Goal Symbols (Parser) 13.3±1.02µs 13.1±0.88µs +1.53%
Hello World (Parser) 3.8±0.30µs 3.8±0.63µs 0.00%
Long file (Parser) 825.5±47.97ns 852.1±57.61ns -3.12%
Mini js (Execution) 730.6±78.38µs 708.5±41.45µs +3.12%
Mini js (Full) 1138.8±81.73µs 1117.4±110.29µs +1.92%
Mini js (Parser) 33.3±2.11µs 34.4±2.78µs -3.20%
Number Object Access (Execution) 4.3±0.59µs 4.5±0.31µs -4.44%
Number Object Access (Full) 347.7±38.00µs 349.3±21.64µs -0.46%
Object Creation (Execution) 5.3±0.40µs 5.4±0.39µs -1.85%
Object Creation (Full) 353.3±21.44µs 363.4±20.39µs -2.78%
RegExp (Execution) 15.3±0.94µs 14.1±1.00µs +8.51%
RegExp (Full) 365.0±23.34µs 393.8±16.87µs -7.31%
RegExp Literal (Execution) 14.2±1.18µs 14.9±1.26µs -4.70%
RegExp Literal (Full) 372.8±29.68µs 401.1±20.18µs -7.06%
RegExp Literal Creation (Execution) 9.7±0.75µs 10.2±0.91µs -4.90%
RegExp Literal Creation (Full) 373.5±31.50µs 392.1±50.64µs -4.74%
Static Object Property Access (Execution) 5.7±0.44µs 5.6±0.61µs +1.79%
Static Object Property Access (Full) 359.5±24.96µs 370.8±18.19µs -3.05%
String Object Access (Execution) 7.7±0.50µs 8.2±0.48µs -6.10%
String Object Access (Full) 345.8±20.56µs 364.8±22.57µs -5.21%
String comparison (Execution) 7.1±0.48µs 7.4±0.55µs -4.05%
String comparison (Full) 361.5±21.99µs 380.9±28.26µs -5.09%
String concatenation (Execution) 6.1±0.51µs 5.8±0.43µs +5.17%
String concatenation (Full) 347.5±22.82µs 372.2±29.41µs -6.64%
String copy (Execution) 4.7±0.35µs 4.5±0.29µs +4.44%
String copy (Full) 340.5±21.06µs 359.7±26.80µs -5.34%
Symbols (Execution) 4.1±0.31µs 4.1±0.38µs 0.00%
Symbols (Full) 305.4±23.83µs 335.8±77.86µs -9.05%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
execution Issues or PRs related to code execution performance Performance related changes and issues
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants