SerenityOS / serenity

The Serenity Operating System 🐞
https://serenityos.org
BSD 2-Clause "Simplified" License
30.45k stars 3.18k forks source link

LibJS: Initialize fields of on-stack `buf` structure #24584

Closed nico closed 3 months ago

nico commented 3 months ago

We pass all fields of buf to add_possible_value(), and at least on Linux setjmp() does not initialize all fields.

Fixes #24560.

nico commented 3 months ago

I didn't expect this to affect perf, but for good measure I measured, and it doesn't:

Suite       Test                                   Speedup  Old (Mean ± Range)        New (Mean ± Range)
----------  -----------------------------------  ---------  ------------------------  ------------------------
...
Kraken      Total                                    1.001  21.050                    21.035
Octane      Total                                    1      169.910                   169.880
All Suites  Total                                    1      190.960                   190.915
Full run details ``` (serenity-js) thakis@Nicos-MBP js-benchmarks % time ./run.py --executable ../serenity/Build/lagom/bin/js --iterations 2 --warmup 3 --suites Kraken,Octane --output before.json Performing warm-up runs of SunSpider... [1/29] Kraken/ai-astar.js completed. Mean: 1.635s ± 0.007s, Range: 1.630s … 1.640s [2/29] Kraken/audio-beat-detection.js completed. Mean: 1.330s ± 0.000s, Range: 1.330s … 1.330s [3/29] Kraken/audio-dft.js completed. Mean: 1.050s ± 0.000s, Range: 1.050s … 1.050s [4/29] Kraken/audio-fft.js completed. Mean: 1.215s ± 0.007s, Range: 1.210s … 1.220s [5/29] Kraken/audio-oscillator.js completed. Mean: 1.415s ± 0.049s, Range: 1.380s … 1.450s [6/29] Kraken/imaging-darkroom.js completed. Mean: 2.040s ± 0.014s, Range: 2.030s … 2.050s [7/29] Kraken/imaging-desaturate.js completed. Mean: 1.960s ± 0.000s, Range: 1.960s … 1.960s [8/29] Kraken/imaging-gaussian-blur.js completed. Mean: 7.485s ± 0.120s, Range: 7.400s … 7.570s [9/29] Kraken/json-parse-financial.js completed. Mean: 0.145s ± 0.007s, Range: 0.140s … 0.150s [10/29] Kraken/json-stringify-tinderbox.js completed. Mean: 0.190s ± 0.000s, Range: 0.190s … 0.190s [11/29] Kraken/stanford-crypto-aes.js completed. Mean: 0.610s ± 0.000s, Range: 0.610s … 0.610s [12/29] Kraken/stanford-crypto-ccm.js completed. Mean: 0.500s ± 0.000s, Range: 0.500s … 0.500s [13/29] Kraken/stanford-crypto-pbkdf2.js completed. Mean: 1.045s ± 0.021s, Range: 1.030s … 1.060s [14/29] Kraken/stanford-crypto-sha256-iterative.js completed. Mean: 0.430s ± 0.000s, Range: 0.430s … 0.430s [15/29] Octane/box2d.js completed. Mean: 2.265s ± 0.007s, Range: 2.260s … 2.270s [16/29] Octane/code-load.js completed. Mean: 2.080s ± 0.014s, Range: 2.070s … 2.090s [17/29] Octane/crypto.js completed. Mean: 6.100s ± 0.014s, Range: 6.090s … 6.110s [18/29] Octane/deltablue.js completed. Mean: 2.030s ± 0.000s, Range: 2.030s … 2.030s [19/29] Octane/earley-boyer.js completed. Mean: 14.955s ± 0.007s, Range: 14.950s … 14.960s [20/29] Octane/gbemu.js completed. Mean: 2.455s ± 0.007s, Range: 2.450s … 2.460s [21/29] Octane/mandreel.js completed. Mean: 12.080s ± 0.028s, Range: 12.060s … 12.100s [22/29] Octane/navier-stokes.js completed. Mean: 3.105s ± 0.007s, Range: 3.100s … 3.110s [23/29] Octane/pdfjs.js completed. Mean: 2.600s ± 0.000s, Range: 2.600s … 2.600s [24/29] Octane/raytrace.js completed. Mean: 5.470s ± 0.042s, Range: 5.440s … 5.500s [25/29] Octane/regexp.js completed. Mean: 21.690s ± 0.057s, Range: 21.650s … 21.730s [26/29] Octane/richards.js completed. Mean: 2.015s ± 0.007s, Range: 2.010s … 2.020s [27/29] Octane/splay.js completed. Mean: 2.595s ± 0.007s, Range: 2.590s … 2.600s [28/29] Octane/typescript.js completed. Mean: 21.130s ± 0.014s, Range: 21.120s … 21.140s [29/29] Octane/zlib.js completed. Mean: 69.340s ± 0.028s, Range: 69.320s … 69.360s Suite Test Mean ± σ Range (min … max) ------- ----------------------------------- -------------- ------------------- Kraken ai-astar.js 1.635 ± 0.007 1.630 … 1.640 Kraken audio-beat-detection.js 1.330 ± 0.000 1.330 … 1.330 Kraken audio-dft.js 1.050 ± 0.000 1.050 … 1.050 Kraken audio-fft.js 1.215 ± 0.007 1.210 … 1.220 Kraken audio-oscillator.js 1.415 ± 0.049 1.380 … 1.450 Kraken imaging-darkroom.js 2.040 ± 0.014 2.030 … 2.050 Kraken imaging-desaturate.js 1.960 ± 0.000 1.960 … 1.960 Kraken imaging-gaussian-blur.js 7.485 ± 0.120 7.400 … 7.570 Kraken json-parse-financial.js 0.145 ± 0.007 0.140 … 0.150 Kraken json-stringify-tinderbox.js 0.190 ± 0.000 0.190 … 0.190 Kraken stanford-crypto-aes.js 0.610 ± 0.000 0.610 … 0.610 Kraken stanford-crypto-ccm.js 0.500 ± 0.000 0.500 … 0.500 Kraken stanford-crypto-pbkdf2.js 1.045 ± 0.021 1.030 … 1.060 Kraken stanford-crypto-sha256-iterative.js 0.430 ± 0.000 0.430 … 0.430 Octane box2d.js 2.265 ± 0.007 2.260 … 2.270 Octane code-load.js 2.080 ± 0.014 2.070 … 2.090 Octane crypto.js 6.100 ± 0.014 6.090 … 6.110 Octane deltablue.js 2.030 ± 0.000 2.030 … 2.030 Octane earley-boyer.js 14.955 ± 0.007 14.950 … 14.960 Octane gbemu.js 2.455 ± 0.007 2.450 … 2.460 Octane mandreel.js 12.080 ± 0.028 12.060 … 12.100 Octane navier-stokes.js 3.105 ± 0.007 3.100 … 3.110 Octane pdfjs.js 2.600 ± 0.000 2.600 … 2.600 Octane raytrace.js 5.470 ± 0.042 5.440 … 5.500 Octane regexp.js 21.690 ± 0.057 21.650 … 21.730 Octane richards.js 2.015 ± 0.007 2.010 … 2.020 Octane splay.js 2.595 ± 0.007 2.590 … 2.600 Octane typescript.js 21.130 ± 0.014 21.120 … 21.140 Octane zlib.js 69.340 ± 0.028 69.320 … 69.360 ./run.py --executable ../serenity/Build/lagom/bin/js --iterations 2 --warmup 383.18s user 5.29s system 99% cpu 6:30.87 total (serenity-js) thakis@Nicos-MBP js-benchmarks % time ./run.py --executable ../serenity/Build/lagom/bin/js --iterations 2 --warmup 3 --suites Kraken,Octane --output after.json Performing warm-up runs of SunSpider... [1/29] Kraken/ai-astar.js completed. Mean: 1.780s ± 0.198s, Range: 1.640s … 1.920s [2/29] Kraken/audio-beat-detection.js completed. Mean: 1.320s ± 0.000s, Range: 1.320s … 1.320s [3/29] Kraken/audio-dft.js completed. Mean: 1.045s ± 0.007s, Range: 1.040s … 1.050s [4/29] Kraken/audio-fft.js completed. Mean: 1.215s ± 0.007s, Range: 1.210s … 1.220s [5/29] Kraken/audio-oscillator.js completed. Mean: 1.355s ± 0.007s, Range: 1.350s … 1.360s [6/29] Kraken/imaging-darkroom.js completed. Mean: 2.080s ± 0.014s, Range: 2.070s … 2.090s [7/29] Kraken/imaging-desaturate.js completed. Mean: 1.950s ± 0.000s, Range: 1.950s … 1.950s [8/29] Kraken/imaging-gaussian-blur.js completed. Mean: 7.380s ± 0.028s, Range: 7.360s … 7.400s [9/29] Kraken/json-parse-financial.js completed. Mean: 0.140s ± 0.000s, Range: 0.140s … 0.140s [10/29] Kraken/json-stringify-tinderbox.js completed. Mean: 0.190s ± 0.000s, Range: 0.190s … 0.190s [11/29] Kraken/stanford-crypto-aes.js completed. Mean: 0.605s ± 0.007s, Range: 0.600s … 0.610s [12/29] Kraken/stanford-crypto-ccm.js completed. Mean: 0.505s ± 0.021s, Range: 0.490s … 0.520s [13/29] Kraken/stanford-crypto-pbkdf2.js completed. Mean: 1.045s ± 0.021s, Range: 1.030s … 1.060s [14/29] Kraken/stanford-crypto-sha256-iterative.js completed. Mean: 0.425s ± 0.007s, Range: 0.420s … 0.430s [15/29] Octane/box2d.js completed. Mean: 2.265s ± 0.007s, Range: 2.260s … 2.270s [16/29] Octane/code-load.js completed. Mean: 2.075s ± 0.007s, Range: 2.070s … 2.080s [17/29] Octane/crypto.js completed. Mean: 6.085s ± 0.007s, Range: 6.080s … 6.090s [18/29] Octane/deltablue.js completed. Mean: 2.020s ± 0.000s, Range: 2.020s … 2.020s [19/29] Octane/earley-boyer.js completed. Mean: 14.935s ± 0.021s, Range: 14.920s … 14.950s [20/29] Octane/gbemu.js completed. Mean: 2.445s ± 0.007s, Range: 2.440s … 2.450s [21/29] Octane/mandreel.js completed. Mean: 12.030s ± 0.014s, Range: 12.020s … 12.040s [22/29] Octane/navier-stokes.js completed. Mean: 3.115s ± 0.007s, Range: 3.110s … 3.120s [23/29] Octane/pdfjs.js completed. Mean: 2.600s ± 0.014s, Range: 2.590s … 2.610s [24/29] Octane/raytrace.js completed. Mean: 5.470s ± 0.042s, Range: 5.440s … 5.500s [25/29] Octane/regexp.js completed. Mean: 21.615s ± 0.007s, Range: 21.610s … 21.620s [26/29] Octane/richards.js completed. Mean: 2.015s ± 0.007s, Range: 2.010s … 2.020s [27/29] Octane/splay.js completed. Mean: 2.600s ± 0.000s, Range: 2.600s … 2.600s [28/29] Octane/typescript.js completed. Mean: 21.090s ± 0.014s, Range: 21.080s … 21.100s [29/29] Octane/zlib.js completed. Mean: 69.520s ± 0.057s, Range: 69.480s … 69.560s Suite Test Mean ± σ Range (min … max) ------- ----------------------------------- -------------- ------------------- Kraken ai-astar.js 1.780 ± 0.198 1.640 … 1.920 Kraken audio-beat-detection.js 1.320 ± 0.000 1.320 … 1.320 Kraken audio-dft.js 1.045 ± 0.007 1.040 … 1.050 Kraken audio-fft.js 1.215 ± 0.007 1.210 … 1.220 Kraken audio-oscillator.js 1.355 ± 0.007 1.350 … 1.360 Kraken imaging-darkroom.js 2.080 ± 0.014 2.070 … 2.090 Kraken imaging-desaturate.js 1.950 ± 0.000 1.950 … 1.950 Kraken imaging-gaussian-blur.js 7.380 ± 0.028 7.360 … 7.400 Kraken json-parse-financial.js 0.140 ± 0.000 0.140 … 0.140 Kraken json-stringify-tinderbox.js 0.190 ± 0.000 0.190 … 0.190 Kraken stanford-crypto-aes.js 0.605 ± 0.007 0.600 … 0.610 Kraken stanford-crypto-ccm.js 0.505 ± 0.021 0.490 … 0.520 Kraken stanford-crypto-pbkdf2.js 1.045 ± 0.021 1.030 … 1.060 Kraken stanford-crypto-sha256-iterative.js 0.425 ± 0.007 0.420 … 0.430 Octane box2d.js 2.265 ± 0.007 2.260 … 2.270 Octane code-load.js 2.075 ± 0.007 2.070 … 2.080 Octane crypto.js 6.085 ± 0.007 6.080 … 6.090 Octane deltablue.js 2.020 ± 0.000 2.020 … 2.020 Octane earley-boyer.js 14.935 ± 0.021 14.920 … 14.950 Octane gbemu.js 2.445 ± 0.007 2.440 … 2.450 Octane mandreel.js 12.030 ± 0.014 12.020 … 12.040 Octane navier-stokes.js 3.115 ± 0.007 3.110 … 3.120 Octane pdfjs.js 2.600 ± 0.014 2.590 … 2.610 Octane raytrace.js 5.470 ± 0.042 5.440 … 5.500 Octane regexp.js 21.615 ± 0.007 21.610 … 21.620 Octane richards.js 2.015 ± 0.007 2.010 … 2.020 Octane splay.js 2.600 ± 0.000 2.600 … 2.600 Octane typescript.js 21.090 ± 0.014 21.080 … 21.100 Octane zlib.js 69.520 ± 0.057 69.480 … 69.560 ./run.py --executable ../serenity/Build/lagom/bin/js --iterations 2 --warmup 383.25s user 5.30s system 99% cpu 6:30.14 total (serenity-js) thakis@Nicos-MBP js-benchmarks % ./compare.py -o before.json -n after.json Suite Test Speedup Old (Mean ± Range) New (Mean ± Range) ---------- ----------------------------------- --------- ------------------------ ------------------------ Kraken ai-astar.js 0.919 1.635 ± 1.630 … 1.640 1.780 ± 1.640 … 1.920 Kraken audio-beat-detection.js 1.008 1.330 ± 1.330 … 1.330 1.320 ± 1.320 … 1.320 Kraken audio-dft.js 1.005 1.050 ± 1.050 … 1.050 1.045 ± 1.040 … 1.050 Kraken audio-fft.js 1 1.215 ± 1.210 … 1.220 1.215 ± 1.210 … 1.220 Kraken audio-oscillator.js 1.044 1.415 ± 1.380 … 1.450 1.355 ± 1.350 … 1.360 Kraken imaging-darkroom.js 0.981 2.040 ± 2.030 … 2.050 2.080 ± 2.070 … 2.090 Kraken imaging-desaturate.js 1.005 1.960 ± 1.960 … 1.960 1.950 ± 1.950 … 1.950 Kraken imaging-gaussian-blur.js 1.014 7.485 ± 7.400 … 7.570 7.380 ± 7.360 … 7.400 Kraken json-parse-financial.js 1.036 0.145 ± 0.140 … 0.150 0.140 ± 0.140 … 0.140 Kraken json-stringify-tinderbox.js 1 0.190 ± 0.190 … 0.190 0.190 ± 0.190 … 0.190 Kraken stanford-crypto-aes.js 1.008 0.610 ± 0.610 … 0.610 0.605 ± 0.600 … 0.610 Kraken stanford-crypto-ccm.js 0.99 0.500 ± 0.500 … 0.500 0.505 ± 0.490 … 0.520 Kraken stanford-crypto-pbkdf2.js 1 1.045 ± 1.030 … 1.060 1.045 ± 1.030 … 1.060 Kraken stanford-crypto-sha256-iterative.js 1.012 0.430 ± 0.430 … 0.430 0.425 ± 0.420 … 0.430 Octane box2d.js 1 2.265 ± 2.260 … 2.270 2.265 ± 2.260 … 2.270 Octane code-load.js 1.002 2.080 ± 2.070 … 2.090 2.075 ± 2.070 … 2.080 Octane crypto.js 1.002 6.100 ± 6.090 … 6.110 6.085 ± 6.080 … 6.090 Octane deltablue.js 1.005 2.030 ± 2.030 … 2.030 2.020 ± 2.020 … 2.020 Octane earley-boyer.js 1.001 14.955 ± 14.950 … 14.960 14.935 ± 14.920 … 14.950 Octane gbemu.js 1.004 2.455 ± 2.450 … 2.460 2.445 ± 2.440 … 2.450 Octane mandreel.js 1.004 12.080 ± 12.060 … 12.100 12.030 ± 12.020 … 12.040 Octane navier-stokes.js 0.997 3.105 ± 3.100 … 3.110 3.115 ± 3.110 … 3.120 Octane pdfjs.js 1 2.600 ± 2.600 … 2.600 2.600 ± 2.590 … 2.610 Octane raytrace.js 1 5.470 ± 5.440 … 5.500 5.470 ± 5.440 … 5.500 Octane regexp.js 1.003 21.690 ± 21.650 … 21.730 21.615 ± 21.610 … 21.620 Octane richards.js 1 2.015 ± 2.010 … 2.020 2.015 ± 2.010 … 2.020 Octane splay.js 0.998 2.595 ± 2.590 … 2.600 2.600 ± 2.600 … 2.600 Octane typescript.js 1.002 21.130 ± 21.120 … 21.140 21.090 ± 21.080 … 21.100 Octane zlib.js 0.997 69.340 ± 69.320 … 69.360 69.520 ± 69.480 … 69.560 Kraken Total 1.001 21.050 21.035 Octane Total 1 169.910 169.880 All Suites Total 1 190.960 190.915 (serenity-js) thakis@Nicos-MBP js-benchmarks % time ./run.py --executable ../serenity/Build/lagom/bin/js --iterations 2 --warmup 3 --suites Kraken,Octane --output after2.json Performing warm-up runs of SunSpider... [1/29] Kraken/ai-astar.js completed. Mean: 1.645s ± 0.035s, Range: 1.620s … 1.670s [2/29] Kraken/audio-beat-detection.js completed. Mean: 1.325s ± 0.007s, Range: 1.320s … 1.330s ^CTraceback (most recent call last):n 1/2) File "/Users/thakis/src/js-benchmarks/./run.py", line 77, in main() File "/Users/thakis/src/js-benchmarks/./run.py", line 60, in main mean, stdev, min_time, max_time, runs = run_benchmark(args.executable, suite, test_file, args.iterations, current_test, total_tests) File "/Users/thakis/src/js-benchmarks/./run.py", line 15, in run_benchmark result = subprocess.run([f"time -p {executable} {suite}/{test_file}"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.DEVNULL, text=True) File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/subprocess.py", line 507, in run stdout, stderr = process.communicate(input, timeout=timeout) File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/subprocess.py", line 1124, in communicate stderr = self.stderr.read() KeyboardInterrupt ./run.py --executable ../serenity/Build/lagom/bin/js --iterations 2 --warmup 12.62s user 0.71s system 96% cpu 13.821 total (serenity-js) thakis@Nicos-MBP js-benchmarks % ```