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] - First prototype for new JsString using UTF-16 #1659

Closed
wants to merge 17 commits into from

Conversation

jedel1043
Copy link
Member

@jedel1043 jedel1043 commented Oct 11, 2021

I think it's time to address the elephant in the room.

This Pull Request will (hopefully!) solve part of #736.

This is a complete rewrite of JsString, but instead of storing u8 bytes it stores u16 words. The encode! macro (renamed to utf16! for simplicity) from the const-utf16 crate allows us to create UTF-16 encoded arrays at compilation time. JsString implements Deref<Target=[u16]> to unlock the slice methods and possibly make some manipulations easier. However, we would need to create our own library of utilities for JsString.

@jedel1043
Copy link
Member Author

jedel1043 commented Oct 11, 2021

In addition, the utf16_literal crate should be useful to convert runtime strings from String to JsString, but we could probably implement a parser ourselves.

@github-actions
Copy link

github-actions bot commented Oct 11, 2021

Test262 conformance changes

VM implementation

Test result main count PR count difference
Total 92,565 92,565 0
Passed 68,926 68,948 +22
Ignored 17,394 17,394 0
Failed 6,245 6,223 -22
Panics 0 0 0
Conformance 74.46% 74.49% +0.02%
Fixed tests (30):
test/built-ins/encodeURIComponent/S15.1.3.4_A1.3_T1.js [strict mode] (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.3_T1.js (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.1_T2.js [strict mode] (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.1_T2.js (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.1_T1.js [strict mode] (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.1_T1.js (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.2_T1.js [strict mode] (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.2_T1.js (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.2_T2.js [strict mode] (previously Failed)
test/built-ins/encodeURIComponent/S15.1.3.4_A1.2_T2.js (previously Failed)
test/built-ins/JSON/stringify/value-string-escape-ascii.js [strict mode] (previously Failed)
test/built-ins/JSON/stringify/value-string-escape-ascii.js (previously Failed)
test/built-ins/JSON/stringify/value-string-escape-unicode.js [strict mode] (previously Failed)
test/built-ins/JSON/stringify/value-string-escape-unicode.js (previously Failed)
test/built-ins/String/prototype/codePointAt/return-first-code-unit.js [strict mode] (previously Failed)
test/built-ins/String/prototype/codePointAt/return-first-code-unit.js (previously Failed)
test/built-ins/String/prototype/codePointAt/return-single-code-unit.js [strict mode] (previously Failed)
test/built-ins/String/prototype/codePointAt/return-single-code-unit.js (previously Failed)
test/built-ins/StringIteratorPrototype/next/next-iteration-surrogate-pairs.js [strict mode] (previously Failed)
test/built-ins/StringIteratorPrototype/next/next-iteration-surrogate-pairs.js (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.2_T1.js [strict mode] (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.2_T1.js (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.1_T1.js [strict mode] (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.1_T1.js (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.2_T2.js [strict mode] (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.2_T2.js (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.1_T2.js [strict mode] (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.1_T2.js (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.3_T1.js [strict mode] (previously Failed)
test/built-ins/encodeURI/S15.1.3.3_A1.3_T1.js (previously Failed)
Broken tests (8):
test/built-ins/RegExp/dotall/with-dotall-unicode.js [strict mode] (previously Passed)
test/built-ins/RegExp/dotall/with-dotall-unicode.js (previously Passed)
test/built-ins/RegExp/dotall/without-dotall-unicode.js [strict mode] (previously Passed)
test/built-ins/RegExp/dotall/without-dotall-unicode.js (previously Passed)
test/language/literals/regexp/S7.8.5_A1.1_T2.js [strict mode] (previously Passed)
test/language/literals/regexp/S7.8.5_A1.1_T2.js (previously Passed)
test/language/literals/regexp/S7.8.5_A2.1_T2.js [strict mode] (previously Passed)
test/language/literals/regexp/S7.8.5_A2.1_T2.js (previously Passed)

boa/src/jsstring.rs Outdated Show resolved Hide resolved
@codecov
Copy link

codecov bot commented Feb 4, 2022

Codecov Report

Merging #1659 (82b78f7) into main (07389cb) will decrease coverage by 0.10%.
The diff coverage is 50.00%.

@@            Coverage Diff             @@
##             main    #1659      +/-   ##
==========================================
- Coverage   40.93%   40.82%   -0.11%     
==========================================
  Files         238      240       +2     
  Lines       22509    22743     +234     
==========================================
+ Hits         9214     9285      +71     
- Misses      13295    13458     +163     
Impacted Files Coverage Δ
boa_engine/src/builtins/eval/mod.rs 12.90% <0.00%> (+0.40%) ⬆️
boa_engine/src/builtins/function/mod.rs 23.73% <0.00%> (-0.37%) ⬇️
boa_engine/src/builtins/intl/date_time_format.rs 55.10% <0.00%> (-1.15%) ⬇️
boa_engine/src/builtins/typed_array/mod.rs 3.75% <0.00%> (-0.01%) ⬇️
boa_engine/src/builtins/uri/mod.rs 9.09% <0.00%> (ø)
boa_engine/src/class.rs 0.00% <ø> (ø)
boa_engine/src/context/mod.rs 30.73% <ø> (ø)
boa_engine/src/lib.rs 82.14% <ø> (ø)
boa_engine/src/syntax/ast/node/template/mod.rs 46.66% <0.00%> (-5.06%) ⬇️
boa_tester/src/exec/js262.rs 0.00% <ø> (ø)
... and 88 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

@github-actions
Copy link

github-actions bot commented Feb 4, 2022

Benchmark for 4aee7ce

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 564.1±27.87ns 582.7±75.83ns +3.30%
Arithmetic operations (Execution) 2.6±0.13µs 2.7±0.27µs +3.85%
Arithmetic operations (Parser) 7.6±0.38µs 7.5±0.32µs -1.32%
Array access (Compiler) 1166.4±76.44ns 1199.9±61.94ns +2.87%
Array access (Execution) 14.3±2.93µs 14.3±0.98µs 0.00%
Array access (Parser) 16.0±1.00µs 16.1±0.86µs +0.63%
Array creation (Compiler) 1644.8±96.50ns 1655.6±123.97ns +0.66%
Array creation (Execution) 4.3±0.32ms 4.0±0.27ms -6.98%
Array creation (Parser) 17.8±1.36µs 17.7±0.73µs -0.56%
Array pop (Compiler) 3.9±0.18µs 3.9±0.20µs 0.00%
Array pop (Execution) 1847.6±210.60µs 1726.3±116.35µs -6.57%
Array pop (Parser) 197.6±12.44µs 209.2±12.54µs +5.87%
Boolean Object Access (Compiler) 1003.5±77.50ns 984.8±68.53ns -1.86%
Boolean Object Access (Execution) 9.5±0.60µs 9.2±0.53µs -3.16%
Boolean Object Access (Parser) 18.7±1.21µs 18.8±1.00µs +0.53%
Clean js (Compiler) 3.1±0.16µs 3.2±0.41µs +3.23%
Clean js (Execution) 1959.8±205.91µs 1913.9±129.45µs -2.34%
Clean js (Parser) 38.1±2.39µs 39.8±4.79µs +4.46%
Create Realm 434.5±27.62ns 439.4±35.38ns +1.13%
Dynamic Object Property Access (Compiler) 1614.8±114.98ns 1624.2±133.34ns +0.58%
Dynamic Object Property Access (Execution) 9.3±0.60µs 9.7±0.67µs +4.30%
Dynamic Object Property Access (Parser) 14.7±1.66µs 14.5±1.00µs -1.36%
Fibonacci (Compiler) 2.2±0.19µs 2.2±0.10µs 0.00%
Fibonacci (Execution) 4.1±0.28ms 4.0±0.20ms -2.44%
Fibonacci (Parser) 21.5±1.32µs 22.2±1.37µs +3.26%
For loop (Compiler) 1792.0±80.59ns 1793.7±93.63ns +0.09%
For loop (Execution) 58.8±4.67µs 60.2±4.26µs +2.38%
For loop (Parser) 19.1±2.43µs 19.4±1.73µs +1.57%
Mini js (Compiler) 3.2±0.72µs 3.1±0.15µs -3.13%
Mini js (Execution) 1775.1±76.73µs 1765.1±78.25µs -0.56%
Mini js (Parser) 33.4±5.70µs 33.8±2.14µs +1.20%
Number Object Access (Compiler) 938.6±40.43ns 914.2±59.85ns -2.60%
Number Object Access (Execution) 7.3±0.53µs 7.6±0.49µs +4.11%
Number Object Access (Parser) 14.7±0.92µs 14.9±0.65µs +1.36%
Object Creation (Compiler) 1384.0±98.98ns 1399.7±113.76ns +1.13%
Object Creation (Execution) 8.5±0.52µs 8.8±0.55µs +3.53%
Object Creation (Parser) 12.3±0.84µs 12.7±1.16µs +3.25%
RegExp (Compiler) 1578.7±113.50ns 1590.9±80.37ns +0.77%
RegExp (Execution) 17.2±1.15µs 17.5±1.29µs +1.74%
RegExp (Parser) 13.7±1.87µs 14.0±1.31µs +2.19%
RegExp Creation (Compiler) 1473.8±81.16ns 1466.4±75.59ns -0.50%
RegExp Creation (Execution) 12.8±0.64µs 12.9±0.56µs +0.78%
RegExp Creation (Parser) 11.3±0.93µs 11.6±0.68µs +2.65%
RegExp Literal (Compiler) 1680.1±208.63ns 1620.1±88.26ns -3.57%
RegExp Literal (Execution) 17.2±1.22µs 17.8±2.09µs +3.49%
RegExp Literal (Parser) 10.8±0.74µs 11.3±1.63µs +4.63%
RegExp Literal Creation (Compiler) 1496.1±92.33ns 1439.5±96.80ns -3.78%
RegExp Literal Creation (Execution) 13.0±1.73µs 13.0±0.76µs 0.00%
RegExp Literal Creation (Parser) 8.4±0.62µs 8.7±0.89µs +3.57%
Static Object Property Access (Compiler) 1407.0±100.29ns 1405.4±70.54ns -0.11%
Static Object Property Access (Execution) 9.1±0.70µs 9.1±0.68µs 0.00%
Static Object Property Access (Parser) 13.0±0.86µs 13.8±1.07µs +6.15%
String Object Access (Compiler) 1442.5±87.51ns 1416.3±94.23ns -1.82%
String Object Access (Execution) 11.7±0.77µs 12.1±1.15µs +3.42%
String Object Access (Parser) 17.9±0.78µs 18.9±1.27µs +5.59%
String comparison (Compiler) 1850.1±90.20ns 1856.2±116.02ns +0.33%
String comparison (Execution) 9.9±0.56µs 10.1±0.81µs +2.02%
String comparison (Parser) 14.6±1.04µs 15.0±0.85µs +2.74%
String concatenation (Compiler) 1554.1±114.18ns 1504.8±143.27ns -3.17%
String concatenation (Execution) 8.7±0.62µs 8.8±0.76µs +1.15%
String concatenation (Parser) 10.0±0.71µs 10.4±0.66µs +4.00%
String copy (Compiler) 1239.7±66.39ns 1267.8±165.26ns +2.27%
String copy (Execution) 7.5±0.71µs 7.3±0.36µs -2.67%
String copy (Parser) 7.4±0.44µs 7.6±0.64µs +2.70%
Symbols (Compiler) 944.0±47.55ns 951.7±58.75ns +0.82%
Symbols (Execution) 7.0±0.53µs 7.1±1.35µs +1.43%
Symbols (Parser) 5.8±0.32µs 5.9±0.34µs +1.72%

@Razican
Copy link
Member

Razican commented Feb 5, 2022

Hi @jedel1043! Do you think you would be able to get back to this? This would be very nice to have :)

@jedel1043
Copy link
Member Author

I'm still working on it locally :)
I'll push incremental commits until I integrate the new type into all the builtins

@github-actions
Copy link

Benchmark for f902625

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 398.7±0.55ns 396.0±0.77ns -0.68%
Arithmetic operations (Execution) 1730.5±3.13ns 1963.3±64.78ns +13.45%
Arithmetic operations (Parser) 5.5±0.01µs 5.6±0.01µs +1.82%
Array access (Compiler) 827.2±2.40ns 828.0±2.04ns +0.10%
Array access (Execution) 10.3±0.03µs 10.4±0.03µs +0.97%
Array access (Parser) 10.4±0.02µs 12.0±0.02µs +15.38%
Array creation (Compiler) 1154.2±2.80ns 1181.8±3.46ns +2.39%
Array creation (Execution) 3.2±0.01ms 3.2±0.01ms 0.00%
Array creation (Parser) 13.2±0.02µs 13.4±0.02µs +1.52%
Array pop (Compiler) 3.0±0.01µs 3.0±0.01µs 0.00%
Array pop (Execution) 1361.2±4.15µs 1370.2±4.79µs +0.66%
Array pop (Parser) 135.9±0.08µs 137.2±0.13µs +0.96%
Boolean Object Access (Compiler) 691.0±1.16ns 712.2±1.18ns +3.07%
Boolean Object Access (Execution) 6.8±0.02µs 6.8±0.02µs 0.00%
Boolean Object Access (Parser) 13.9±0.01µs 14.1±0.02µs +1.44%
Clean js (Compiler) 2.2±0.00µs 2.2±0.01µs 0.00%
Clean js (Execution) 1464.4±10.65µs 1496.7±11.26µs +2.21%
Clean js (Parser) 28.3±0.03µs 28.6±0.04µs +1.06%
Create Realm 329.1±0.21ns 335.9±0.32ns +2.07%
Dynamic Object Property Access (Compiler) 1140.9±2.49ns 1163.1±3.74ns +1.95%
Dynamic Object Property Access (Execution) 6.8±0.05µs 6.9±0.04µs +1.47%
Dynamic Object Property Access (Parser) 10.6±0.02µs 10.7±0.03µs +0.94%
Fibonacci (Compiler) 1468.2±3.29ns 1471.3±3.66ns +0.21%
Fibonacci (Execution) 2.7±0.00ms 2.7±0.00ms 0.00%
Fibonacci (Parser) 15.8±0.02µs 16.0±0.05µs +1.27%
For loop (Compiler) 1261.4±3.40ns 1282.8±3.58ns +1.70%
For loop (Execution) 43.7±0.17µs 42.5±0.11µs -2.75%
For loop (Parser) 13.5±0.03µs 13.7±0.03µs +1.48%
Mini js (Compiler) 2.2±0.01µs 2.2±0.01µs 0.00%
Mini js (Execution) 1204.6±7.60µs 1362.3±7.69µs +13.09%
Mini js (Parser) 24.8±0.02µs 24.9±0.03µs +0.40%
Number Object Access (Compiler) 647.9±1.49ns 659.3±1.64ns +1.76%
Number Object Access (Execution) 5.5±0.04µs 5.3±0.02µs -3.64%
Number Object Access (Parser) 11.0±0.01µs 9.7±0.01µs -11.82%
Object Creation (Compiler) 957.8±4.72ns 971.4±2.58ns +1.42%
Object Creation (Execution) 6.1±0.03µs 6.3±0.04µs +3.28%
Object Creation (Parser) 9.2±0.02µs 9.3±0.03µs +1.09%
RegExp (Compiler) 1153.0±6.03ns 1135.3±1.40ns -1.54%
RegExp (Execution) 13.1±0.06µs 13.2±0.03µs +0.76%
RegExp (Parser) 8.8±0.02µs 10.2±0.06µs +15.91%
RegExp Creation (Compiler) 1024.9±3.41ns 1042.2±3.11ns +1.69%
RegExp Creation (Execution) 9.9±0.06µs 10.0±0.05µs +1.01%
RegExp Creation (Parser) 8.3±0.02µs 8.6±0.03µs +3.61%
RegExp Literal (Compiler) 1123.0±6.26ns 1160.4±4.06ns +3.33%
RegExp Literal (Execution) 13.2±0.03µs 11.6±0.03µs -12.12%
RegExp Literal (Parser) 8.0±0.01µs 7.3±0.01µs -8.75%
RegExp Literal Creation (Compiler) 1021.9±3.17ns 1029.9±2.64ns +0.78%
RegExp Literal Creation (Execution) 9.9±0.05µs 10.0±0.05µs +1.01%
RegExp Literal Creation (Parser) 6.3±0.01µs 6.4±0.01µs +1.59%
Static Object Property Access (Compiler) 969.3±2.62ns 982.6±2.46ns +1.37%
Static Object Property Access (Execution) 6.4±0.03µs 6.5±0.03µs +1.56%
Static Object Property Access (Parser) 9.9±0.02µs 10.0±0.03µs +1.01%
String Object Access (Compiler) 1013.2±3.34ns 1046.0±6.56ns +3.24%
String Object Access (Execution) 8.7±0.08µs 8.8±0.03µs +1.15%
String Object Access (Parser) 13.7±0.03µs 13.8±0.04µs +0.73%
String comparison (Compiler) 1274.0±4.16ns 1302.4±36.73ns +2.23%
String comparison (Execution) 7.2±0.03µs 6.3±0.03µs -12.50%
String comparison (Parser) 10.6±0.02µs 10.7±0.17µs +0.94%
String concatenation (Compiler) 1043.7±1.68ns 1053.0±3.54ns +0.89%
String concatenation (Execution) 6.1±0.02µs 6.1±0.02µs 0.00%
String concatenation (Parser) 7.4±0.02µs 7.4±0.04µs 0.00%
String copy (Compiler) 773.0±1.92ns 877.7±2.70ns +13.54%
String copy (Execution) 5.2±0.02µs 5.3±0.02µs +1.92%
String copy (Parser) 5.5±0.01µs 5.6±0.02µs +1.82%
Symbols (Compiler) 639.3±1.20ns 642.2±1.28ns +0.45%
Symbols (Execution) 4.9±0.02µs 5.0±0.03µs +2.04%
Symbols (Parser) 3.7±0.01µs 4.3±0.02µs +16.22%

@github-actions
Copy link

Benchmark for c3d66b0

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 353.7±0.89ns 343.9±0.65ns -2.77%
Arithmetic operations (Execution) 1725.9±7.77ns 1915.1±2.08ns +10.96%
Arithmetic operations (Parser) 4.9±0.01µs 4.9±0.01µs 0.00%
Array access (Compiler) 724.5±4.91ns 829.4±2.78ns +14.48%
Array access (Execution) 9.1±0.05µs 9.1±0.03µs 0.00%
Array access (Parser) 10.6±0.02µs 11.9±0.02µs +12.26%
Array creation (Compiler) 1014.6±4.81ns 1176.1±7.15ns +15.92%
Array creation (Execution) 2.8±0.01ms 2.9±0.01ms +3.57%
Array creation (Parser) 11.8±0.02µs 13.3±0.02µs +12.71%
Array pop (Compiler) 2.6±0.01µs 3.0±0.01µs +15.38%
Array pop (Execution) 1204.0±3.91µs 1373.0±4.87µs +14.04%
Array pop (Parser) 137.4±0.53µs 137.2±0.33µs -0.15%
Boolean Object Access (Compiler) 606.5±2.08ns 709.8±0.93ns +17.03%
Boolean Object Access (Execution) 6.0±0.03µs 6.0±0.01µs 0.00%
Boolean Object Access (Parser) 14.2±0.03µs 14.0±0.01µs -1.41%
Clean js (Compiler) 2.2±0.00µs 1952.3±6.92ns -11.26%
Clean js (Execution) 1297.6±12.26µs 1498.4±11.14µs +15.47%
Clean js (Parser) 25.4±0.03µs 28.6±0.19µs +12.60%
Create Realm 328.2±0.13ns 294.8±0.88ns -10.18%
Dynamic Object Property Access (Compiler) 1016.9±5.12ns 1167.5±12.46ns +14.81%
Dynamic Object Property Access (Execution) 6.4±0.41µs 6.1±0.06µs -4.69%
Dynamic Object Property Access (Parser) 9.5±0.02µs 10.6±0.01µs +11.58%
Fibonacci (Compiler) 1465.1±4.14ns 1296.1±2.92ns -11.54%
Fibonacci (Execution) 2.4±0.00ms 2.4±0.00ms 0.00%
Fibonacci (Parser) 14.2±0.04µs 14.1±0.03µs -0.70%
For loop (Compiler) 1288.0±7.41ns 1157.6±3.97ns -10.12%
For loop (Execution) 38.2±0.13µs 37.7±0.10µs -1.31%
For loop (Parser) 12.1±0.03µs 13.7±0.12µs +13.22%
Mini js (Compiler) 2.1±0.00µs 1948.4±5.81ns -7.22%
Mini js (Execution) 1192.5±5.06µs 1382.4±11.06µs +15.92%
Mini js (Parser) 25.1±0.04µs 25.0±0.03µs -0.40%
Number Object Access (Compiler) 570.8±1.10ns 672.2±1.57ns +17.76%
Number Object Access (Execution) 4.8±0.03µs 4.7±0.01µs -2.08%
Number Object Access (Parser) 9.8±0.01µs 9.7±0.02µs -1.02%
Object Creation (Compiler) 972.9±3.26ns 853.8±3.23ns -12.24%
Object Creation (Execution) 5.4±0.02µs 5.5±0.01µs +1.85%
Object Creation (Parser) 8.2±0.02µs 9.2±0.02µs +12.20%
RegExp (Compiler) 1034.4±15.66ns 1147.9±2.80ns +10.97%
RegExp (Execution) 11.6±0.04µs 11.5±0.03µs -0.86%
RegExp (Parser) 9.0±0.01µs 10.1±0.02µs +12.22%
RegExp Creation (Compiler) 904.8±14.12ns 1035.3±3.09ns +14.42%
RegExp Creation (Execution) 8.8±0.06µs 8.8±0.03µs 0.00%
RegExp Creation (Parser) 8.5±0.02µs 8.5±0.02µs 0.00%
RegExp Literal (Compiler) 1020.4±19.18ns 1157.0±3.53ns +13.39%
RegExp Literal (Execution) 13.2±0.09µs 11.5±0.04µs -12.88%
RegExp Literal (Parser) 8.2±0.02µs 7.2±0.02µs -12.20%
RegExp Literal Creation (Compiler) 910.1±6.98ns 1015.1±4.35ns +11.54%
RegExp Literal Creation (Execution) 8.7±0.03µs 8.7±0.11µs 0.00%
RegExp Literal Creation (Parser) 5.7±0.02µs 5.6±0.02µs -1.75%
Static Object Property Access (Compiler) 849.2±2.96ns 866.0±2.52ns +1.98%
Static Object Property Access (Execution) 5.7±0.01µs 5.7±0.01µs 0.00%
Static Object Property Access (Parser) 8.8±0.02µs 9.8±0.04µs +11.36%
String Object Access (Compiler) 915.6±1.99ns 1030.3±6.12ns +12.53%
String Object Access (Execution) 8.8±0.09µs 7.8±0.03µs -11.36%
String Object Access (Parser) 13.9±0.02µs 12.1±0.03µs -12.95%
String comparison (Compiler) 1140.0±6.61ns 1137.1±1.78ns -0.25%
String comparison (Execution) 6.3±0.03µs 6.3±0.02µs 0.00%
String comparison (Parser) 10.8±0.01µs 10.7±0.03µs -0.93%
String concatenation (Compiler) 920.6±5.73ns 931.7±2.03ns +1.21%
String concatenation (Execution) 5.4±0.02µs 5.3±0.01µs -1.85%
String concatenation (Parser) 6.6±0.01µs 6.7±0.34µs +1.52%
String copy (Compiler) 754.0±2.71ns 859.2±3.58ns +13.95%
String copy (Execution) 4.6±0.03µs 5.2±0.01µs +13.04%
String copy (Parser) 5.6±0.01µs 5.6±0.03µs 0.00%
Symbols (Compiler) 650.2±1.81ns 578.9±1.37ns -10.97%
Symbols (Execution) 4.9±0.02µs 4.4±0.01µs -10.20%
Symbols (Parser) 3.8±0.02µs 3.8±0.02µs 0.00%

@jedel1043
Copy link
Member Author

Time to see how many tests break... 😅

@jedel1043 jedel1043 force-pushed the utf16-str branch 5 times, most recently from 69b3ce9 to cdb7d38 Compare February 17, 2022 22:37
@jedel1043
Copy link
Member Author

jedel1043 commented Feb 17, 2022

Well, I expected to see more failed tests tbh, I'll probably fix those today or tomorrow. It could also be that we cannot parse string literals with UTF-16 codepoints; the interner automatically converts unpaired surrogates to \uFFFD.

On another note, the interner doesn't support UTF-16 strings, so we will need to contribute to string-interner the missing features.

@Razican
Copy link
Member

Razican commented Feb 18, 2022

Well, I expected to see more failed tests tbh, I'll probably fix those today or tomorrow. It could also be that we cannot parse string literals with UTF-16 codepoints; the interner automatically converts unpaired surrogates to \uFFFD.

On another note, the interner doesn't support UTF-16 strings, so we will need to contribute to string-interner the missing features.

Yes, but they might not want to add this feature, so we might end up needing to write our own interner. Let's see if we can open them an issue.

@github-actions
Copy link

Benchmark for c115fd5

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 634.1±3.69ns 578.3±4.81ns -8.80%
Arithmetic operations (Execution) 749.1±5.81ns 808.4±5.65ns +7.92%
Arithmetic operations (Parser) 7.1±0.06µs 7.2±0.05µs +1.41%
Array access (Compiler) 1670.8±13.85ns 1648.7±13.33ns -1.32%
Array access (Execution) 8.4±0.08µs 10.7±0.10µs +27.38%
Array access (Parser) 14.9±0.09µs 15.2±0.18µs +2.01%
Array creation (Compiler) 2.6±0.02µs 2.5±0.03µs -3.85%
Array creation (Execution) 1477.5±95.17µs 1585.2±12.88µs +7.29%
Array creation (Parser) 17.6±0.11µs 17.9±0.12µs +1.70%
Array pop (Compiler) 5.0±0.02µs 4.7±0.06µs -6.00%
Array pop (Execution) 719.4±9.14µs 884.2±9.16µs +22.91%
Array pop (Parser) 167.3±2.07µs 172.4±1.18µs +3.05%
Boolean Object Access (Compiler) 1218.4±14.95ns 1181.3±14.58ns -3.04%
Boolean Object Access (Execution) 5.1±0.05µs 6.3±0.06µs +23.53%
Boolean Object Access (Parser) 17.8±0.16µs 17.8±0.18µs 0.00%
Clean js (Compiler) 5.4±0.04µs 5.2±0.05µs -3.70%
Clean js (Execution) 728.7±6.85µs 866.3±8.96µs +18.88%
Clean js (Parser) 36.4±0.36µs 36.8±0.40µs +1.10%
Create Realm 313.7±12.32ns 302.9±17.70ns -3.44%
Dynamic Object Property Access (Compiler) 1948.1±22.65ns 1944.7±26.06ns -0.17%
Dynamic Object Property Access (Execution) 5.6±0.07µs 6.5±0.05µs +16.07%
Dynamic Object Property Access (Parser) 13.5±0.12µs 13.7±0.12µs +1.48%
Fibonacci (Compiler) 3.0±0.02µs 3.0±0.03µs 0.00%
Fibonacci (Execution) 1218.6±8.12µs 1318.8±6.90µs +8.22%
Fibonacci (Parser) 20.7±0.20µs 21.0±0.11µs +1.45%
For loop (Compiler) 2.9±0.02µs 2.8±0.02µs -3.45%
For loop (Execution) 19.5±0.17µs 20.3±0.27µs +4.10%
For loop (Parser) 18.1±0.16µs 18.4±0.19µs +1.66%
Mini js (Compiler) 4.7±0.04µs 4.6±0.06µs -2.13%
Mini js (Execution) 663.6±7.12µs 807.1±8.83µs +21.62%
Mini js (Parser) 32.5±1.19µs 31.7±0.20µs -2.46%
Number Object Access (Compiler) 1148.8±6.65ns 1107.7±11.06ns -3.58%
Number Object Access (Execution) 4.0±0.02µs 4.9±0.04µs +22.50%
Number Object Access (Parser) 14.0±0.14µs 14.1±0.10µs +0.71%
Object Creation (Compiler) 1747.3±16.44ns 1700.1±12.70ns -2.70%
Object Creation (Execution) 5.3±0.04µs 6.0±0.03µs +13.21%
Object Creation (Parser) 12.0±0.11µs 12.1±0.09µs +0.83%
RegExp (Compiler) 1936.8±27.20ns 1918.5±24.78ns -0.94%
RegExp (Execution) 13.5±0.12µs 16.6±0.14µs +22.96%
RegExp (Parser) 13.0±0.20µs 12.9±0.10µs -0.77%
RegExp Creation (Compiler) 1738.7±15.84ns 1739.6±20.54ns +0.05%
RegExp Creation (Execution) 10.2±0.09µs 11.7±0.82µs +14.71%
RegExp Creation (Parser) 10.9±0.11µs 10.9±0.12µs 0.00%
RegExp Literal (Compiler) 1940.8±21.84ns 1931.8±24.30ns -0.46%
RegExp Literal (Execution) 13.5±0.14µs 16.5±0.14µs +22.22%
RegExp Literal (Parser) 10.5±0.16µs 10.5±0.13µs 0.00%
RegExp Literal Creation (Compiler) 1739.8±23.14ns 1736.0±19.99ns -0.22%
RegExp Literal Creation (Execution) 10.7±0.66µs 11.2±0.11µs +4.67%
RegExp Literal Creation (Parser) 8.1±0.07µs 8.3±0.14µs +2.47%
Static Object Property Access (Compiler) 1760.2±18.11ns 1716.1±14.56ns -2.51%
Static Object Property Access (Execution) 5.4±0.06µs 6.2±0.05µs +14.81%
Static Object Property Access (Parser) 12.7±0.14µs 12.7±0.16µs 0.00%
String Object Access (Compiler) 1559.5±10.71ns 1547.1±15.57ns -0.80%
String Object Access (Execution) 7.2±0.04µs 8.9±0.12µs +23.61%
String Object Access (Parser) 17.6±0.16µs 17.4±0.14µs -1.14%
String comparison (Compiler) 2.6±0.03µs 2.5±0.03µs -3.85%
String comparison (Execution) 4.8±0.05µs 5.3±0.03µs +10.42%
String comparison (Parser) 13.9±0.16µs 14.1±0.12µs +1.44%
String concatenation (Compiler) 1972.3±12.58ns 1972.1±15.36ns -0.01%
String concatenation (Execution) 4.5±0.04µs 5.1±0.04µs +13.33%
String concatenation (Parser) 9.6±0.07µs 9.7±0.05µs +1.04%
String copy (Compiler) 1612.1±9.66ns 1586.1±17.53ns -1.61%
String copy (Execution) 4.2±0.04µs 4.7±0.02µs +11.90%
String copy (Parser) 7.1±0.06µs 7.2±0.09µs +1.41%
Symbols (Compiler) 1200.3±10.30ns 1183.3±6.50ns -1.42%
Symbols (Execution) 4.2±0.04µs 4.9±0.20µs +16.67%
Symbols (Parser) 5.7±0.06µs 5.6±0.04µs -1.75%

@github-actions
Copy link

Benchmark for 14d3cf4

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 698.0±37.20ns 681.9±33.04ns -2.31%
Arithmetic operations (Execution) 771.2±32.52ns 799.5±23.56ns +3.67%
Arithmetic operations (Parser) 8.1±0.36µs 8.2±0.32µs +1.23%
Array access (Compiler) 1958.8±107.04ns 1970.9±84.42ns +0.62%
Array access (Execution) 9.2±0.32µs 12.5±0.60µs +35.87%
Array access (Parser) 16.7±0.74µs 16.8±0.54µs +0.60%
Array creation (Compiler) 3.0±0.18µs 3.1±0.26µs +3.33%
Array creation (Execution) 1354.1±66.81µs 1693.2±91.21µs +25.04%
Array creation (Parser) 20.1±1.10µs 20.3±1.31µs +1.00%
Array pop (Compiler) 5.5±0.55µs 5.2±0.30µs -5.45%
Array pop (Execution) 709.5±28.17µs 950.0±42.87µs +33.90%
Array pop (Parser) 192.0±5.93µs 204.1±11.97µs +6.30%
Boolean Object Access (Compiler) 1504.9±93.85ns 1470.0±71.82ns -2.32%
Boolean Object Access (Execution) 5.5±0.22µs 7.1±0.33µs +29.09%
Boolean Object Access (Parser) 19.3±0.69µs 19.2±0.71µs -0.52%
Clean js (Compiler) 6.3±0.47µs 6.6±0.36µs +4.76%
Clean js (Execution) 759.4±24.08µs 958.7±32.65µs +26.24%
Clean js (Parser) 41.8±1.76µs 41.8±2.40µs 0.00%
Create Realm 298.9±6.11ns 304.2±8.56ns +1.77%
Dynamic Object Property Access (Compiler) 2.3±0.11µs 2.4±0.17µs +4.35%
Dynamic Object Property Access (Execution) 6.6±0.36µs 7.8±0.26µs +18.18%
Dynamic Object Property Access (Parser) 15.5±0.62µs 15.4±0.57µs -0.65%
Fibonacci (Compiler) 3.5±0.24µs 3.7±0.16µs +5.71%
Fibonacci (Execution) 1352.3±63.42µs 1546.2±77.06µs +14.34%
Fibonacci (Parser) 23.2±1.07µs 24.3±2.20µs +4.74%
For loop (Compiler) 3.4±0.49µs 3.6±0.24µs +5.88%
For loop (Execution) 21.6±0.99µs 24.0±1.58µs +11.11%
For loop (Parser) 20.1±1.17µs 20.4±0.61µs +1.49%
Mini js (Compiler) 5.5±0.27µs 5.9±0.29µs +7.27%
Mini js (Execution) 682.0±27.79µs 864.3±26.72µs +26.73%
Mini js (Parser) 36.7±3.03µs 36.2±2.40µs -1.36%
Number Object Access (Compiler) 1376.4±55.25ns 1394.9±48.64ns +1.34%
Number Object Access (Execution) 4.3±0.22µs 5.6±0.41µs +30.23%
Number Object Access (Parser) 15.5±0.65µs 15.4±0.97µs -0.65%
Object Creation (Compiler) 2.1±0.08µs 2.1±0.06µs 0.00%
Object Creation (Execution) 5.9±0.20µs 7.1±0.31µs +20.34%
Object Creation (Parser) 13.5±0.46µs 13.6±0.48µs +0.74%
RegExp (Compiler) 2.3±0.14µs 2.4±0.13µs +4.35%
RegExp (Execution) 14.8±0.79µs 20.1±1.46µs +35.81%
RegExp (Parser) 14.4±0.56µs 14.4±0.34µs 0.00%
RegExp Creation (Compiler) 2.0±0.06µs 2.1±0.13µs +5.00%
RegExp Creation (Execution) 10.9±0.56µs 12.6±0.56µs +15.60%
RegExp Creation (Parser) 12.0±0.38µs 12.1±0.33µs +0.83%
RegExp Literal (Compiler) 2.3±0.11µs 2.4±0.31µs +4.35%
RegExp Literal (Execution) 14.7±0.48µs 19.4±1.35µs +31.97%
RegExp Literal (Parser) 11.7±0.45µs 11.6±0.36µs -0.85%
RegExp Literal Creation (Compiler) 2.1±0.13µs 2.1±0.06µs 0.00%
RegExp Literal Creation (Execution) 10.9±0.66µs 12.7±0.65µs +16.51%
RegExp Literal Creation (Parser) 9.1±0.37µs 9.2±0.35µs +1.10%
Static Object Property Access (Compiler) 2.0±0.08µs 2.1±0.08µs +5.00%
Static Object Property Access (Execution) 6.1±0.30µs 7.4±0.38µs +21.31%
Static Object Property Access (Parser) 14.2±0.49µs 14.4±0.32µs +1.41%
String Object Access (Compiler) 1874.8±99.64ns 1905.3±115.70ns +1.63%
String Object Access (Execution) 7.9±0.37µs 10.1±0.70µs +27.85%
String Object Access (Parser) 18.9±0.71µs 19.5±1.29µs +3.17%
String comparison (Compiler) 3.0±0.14µs 3.2±0.30µs +6.67%
String comparison (Execution) 5.4±0.28µs 6.3±0.50µs +16.67%
String comparison (Parser) 15.7±0.51µs 15.7±1.61µs 0.00%
String concatenation (Compiler) 2.3±0.13µs 2.4±0.11µs +4.35%
String concatenation (Execution) 5.0±0.33µs 5.9±0.27µs +18.00%
String concatenation (Parser) 11.0±0.57µs 10.8±0.33µs -1.82%
String copy (Compiler) 1945.6±79.79ns 1996.9±64.48ns +2.64%
String copy (Execution) 4.7±0.19µs 5.5±0.32µs +17.02%
String copy (Parser) 8.2±0.30µs 8.1±0.29µs -1.22%
Symbols (Compiler) 1460.8±96.54ns 1492.5±87.18ns +2.17%
Symbols (Execution) 4.8±0.27µs 5.6±0.33µs +16.67%
Symbols (Parser) 6.4±0.17µs 6.5±0.52µs +1.56%

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 very good :) It's a pitty the performance decrease, but we can merge this now and then spend some time enhancing the performance.

Check my comments and see if they make sense, before merging

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

Benchmark for 5dd62b2

Click to view benchmark
Test Base PR %
Arithmetic operations (Compiler) 542.7±1.02ns 515.8±1.25ns -4.96%
Arithmetic operations (Execution) 632.7±0.97ns 690.7±6.44ns +9.17%
Arithmetic operations (Parser) 6.5±0.01µs 6.6±0.01µs +1.54%
Array access (Compiler) 1412.0±3.09ns 1393.4±2.96ns -1.32%
Array access (Execution) 7.2±0.03µs 9.1±0.02µs +26.39%
Array access (Parser) 13.6±0.02µs 13.8±0.02µs +1.47%
Array creation (Compiler) 2.2±0.00µs 2.2±0.01µs 0.00%
Array creation (Execution) 1172.0±3.62µs 1309.4±3.46µs +11.72%
Array creation (Parser) 15.9±0.03µs 16.2±0.03µs +1.89%
Array pop (Compiler) 4.2±0.01µs 4.0±0.01µs -4.76%
Array pop (Execution) 604.5±1.15µs 753.3±2.62µs +24.62%
Array pop (Parser) 149.7±0.12µs 150.3±0.21µs +0.40%
Boolean Object Access (Compiler) 1130.1±1.32ns 1120.0±8.36ns -0.89%
Boolean Object Access (Execution) 4.3±0.01µs 5.3±0.01µs +23.26%
Boolean Object Access (Parser) 16.2±0.02µs 16.3±0.01µs +0.62%
Clean js (Compiler) 4.7±0.01µs 4.6±0.01µs -2.13%
Clean js (Execution) 606.8±2.86µs 747.4±2.61µs +23.17%
Clean js (Parser) 32.9±0.07µs 33.1±0.04µs +0.61%
Create Realm 245.6±0.21ns 241.1±1.53ns -1.83%
Dynamic Object Property Access (Compiler) 1640.6±2.90ns 1721.2±10.93ns +4.91%
Dynamic Object Property Access (Execution) 4.8±0.01µs 5.4±0.02µs +12.50%
Dynamic Object Property Access (Parser) 12.4±0.03µs 12.5±0.01µs +0.81%
Fibonacci (Compiler) 2.6±0.00µs 2.6±0.01µs 0.00%
Fibonacci (Execution) 1029.5±2.84µs 1115.7±2.84µs +8.37%
Fibonacci (Parser) 18.6±0.02µs 19.1±0.04µs +2.69%
For loop (Compiler) 2.5±0.00µs 2.4±0.01µs -4.00%
For loop (Execution) 16.3±0.03µs 17.0±0.11µs +4.29%
For loop (Parser) 16.3±0.02µs 16.5±0.02µs +1.23%
Mini js (Compiler) 4.1±0.02µs 4.0±0.02µs -2.44%
Mini js (Execution) 558.0±4.07µs 691.6±4.06µs +23.94%
Mini js (Parser) 28.7±0.05µs 28.6±0.03µs -0.35%
Number Object Access (Compiler) 1062.9±3.08ns 1036.0±3.26ns -2.53%
Number Object Access (Execution) 3.3±0.01µs 4.1±0.05µs +24.24%
Number Object Access (Parser) 12.6±0.02µs 12.8±0.02µs +1.59%
Object Creation (Compiler) 1445.7±11.50ns 1456.8±4.47ns +0.77%
Object Creation (Execution) 4.4±0.01µs 5.0±0.01µs +13.64%
Object Creation (Parser) 10.8±0.02µs 11.0±0.02µs +1.85%
RegExp (Compiler) 1648.0±4.38ns 1652.5±8.42ns +0.27%
RegExp (Execution) 11.6±0.04µs 14.6±0.06µs +25.86%
RegExp (Parser) 11.9±0.01µs 11.9±0.02µs 0.00%
RegExp Creation (Compiler) 1475.4±13.92ns 1486.8±4.82ns +0.77%
RegExp Creation (Execution) 8.7±0.07µs 9.9±0.04µs +13.79%
RegExp Creation (Parser) 9.9±0.02µs 10.1±0.02µs +2.02%
RegExp Literal (Compiler) 1668.6±10.79ns 1657.3±3.17ns -0.68%
RegExp Literal (Execution) 11.6±0.02µs 14.6±0.06µs +25.86%
RegExp Literal (Parser) 9.6±0.02µs 9.6±0.04µs 0.00%
RegExp Literal Creation (Compiler) 1489.5±12.26ns 1486.3±4.95ns -0.21%
RegExp Literal Creation (Execution) 8.6±0.02µs 9.9±0.03µs +15.12%
RegExp Literal Creation (Parser) 7.5±0.03µs 7.6±0.01µs +1.33%
Static Object Property Access (Compiler) 1464.4±5.81ns 1480.0±6.62ns +1.07%
Static Object Property Access (Execution) 4.6±0.01µs 5.2±0.02µs +13.04%
Static Object Property Access (Parser) 11.5±0.02µs 11.7±0.02µs +1.74%
String Object Access (Compiler) 1418.9±4.36ns 1445.9±69.33ns +1.90%
String Object Access (Execution) 6.1±0.02µs 7.6±0.03µs +24.59%
String Object Access (Parser) 15.7±0.02µs 15.8±0.03µs +0.64%
String comparison (Compiler) 2.2±0.01µs 2.2±0.03µs 0.00%
String comparison (Execution) 4.0±0.02µs 4.4±0.01µs +10.00%
String comparison (Parser) 12.7±0.03µs 12.9±0.01µs +1.57%
String concatenation (Compiler) 1671.2±3.70ns 1657.8±8.02ns -0.80%
String concatenation (Execution) 3.8±0.04µs 4.2±0.02µs +10.53%
String concatenation (Parser) 8.8±0.01µs 9.0±0.01µs +2.27%
String copy (Compiler) 1366.7±2.48ns 1337.2±7.21ns -2.16%
String copy (Execution) 3.5±0.01µs 3.9±0.01µs +11.43%
String copy (Parser) 6.7±0.02µs 6.8±0.01µs +1.49%
Symbols (Compiler) 1024.3±1.91ns 994.3±4.06ns -2.93%
Symbols (Execution) 3.5±0.01µs 3.9±0.01µs +11.43%
Symbols (Parser) 5.3±0.01µs 5.3±0.02µs 0.00%

@jedel1043
Copy link
Member Author

bors r+

bors bot pushed a commit that referenced this pull request Oct 11, 2022
I think it's time to address the elephant in the room.

This Pull Request will (hopefully!) solve part of #736.

This is a complete rewrite of `JsString`, but instead of storing `u8` bytes it stores `u16` words. The `encode!` macro (renamed to `utf16!` for simplicity) from the `const-utf16` crate allows us to create UTF-16 encoded arrays at compilation time. `JsString` implements `Deref<Target=[u16]>` to unlock the slice methods and possibly make some manipulations easier. However, we would need to create our own library of utilities for `JsString`.
@bors
Copy link

bors bot commented Oct 11, 2022

Pull request successfully merged into main.

Build succeeded:

@bors bors bot changed the title First prototype for new JsString using UTF-16 [Merged by Bors] - First prototype for new JsString using UTF-16 Oct 11, 2022
@bors bors bot closed this Oct 11, 2022
@bors bors bot deleted the utf16-str branch October 11, 2022 18:19
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 Internal Category for changelog run-benchmark Label used to run banchmarks on PRs
Projects
None yet
6 participants