From 6130aa8168da09e62fa92301fca6e54b74f9a797 Mon Sep 17 00:00:00 2001 From: SUZUKI Sosuke Date: Mon, 26 Jan 2026 17:25:51 +0900 Subject: [PATCH] Add benchmark for `[...set]` (#26452) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What does this PR do? Adds benchmark for `[...set]` ### How did you verify your code works? ### Results **Bun 1.3.6** ``` clk: ~3.77 GHz cpu: Apple M4 Max runtime: bun 1.3.6 (arm64-darwin) benchmark avg (min … max) p75 p99 (min … top 1%) ------------------------------------------- ------------------------------- [...set] - integers (10) 51.70 ns/iter 51.16 ns █▄ (45.17 ns … 121.75 ns) 87.65 ns ▁▁██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - integers (100) 394.07 ns/iter 394.41 ns █▇▂ (378.73 ns … 443.39 ns) 437.51 ns ▂████▆▄▂▁▁▁▁▂▃▃▄▂▂▁▂▁ [...set] - strings (10) 53.86 ns/iter 53.66 ns █ (50.72 ns … 115.85 ns) 89.37 ns ▃█▆▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - strings (100) 422.12 ns/iter 422.80 ns ▅██▄ (392.35 ns … 977.34 ns) 481.31 ns ▂▂▅████▇▃▂▁▂▃▄▄▃▃▁▁▁▁ [...set] - objects (10) 54.07 ns/iter 54.33 ns █▇ (49.83 ns … 98.49 ns) 87.07 ns ▂██▇▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - objects (100) 446.81 ns/iter 441.72 ns █ (397.71 ns … 954.87 ns) 824.61 ns ▂█▃▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ``` **Bun 1.3.7 canary** ``` clk: ~3.82 GHz cpu: Apple M4 Max runtime: bun 1.3.7 (arm64-darwin) benchmark avg (min … max) p75 p99 (min … top 1%) ------------------------------------------- ------------------------------- [...set] - integers (10) 4.71 ns/iter 4.62 ns █▄ (3.88 ns … 48.91 ns) 11.42 ns ▂██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - integers (100) 42.52 ns/iter 42.70 ns █ (35.70 ns … 88.03 ns) 74.86 ns ▃█▂██▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - strings (10) 6.02 ns/iter 5.86 ns ▇█ (3.99 ns … 49.43 ns) 8.89 ns ▁▁▁▁▁▂██▆▃▃▂▁▁▁▁▁▁▁▁▁ [...set] - strings (100) 56.81 ns/iter 55.91 ns █ (48.70 ns … 96.89 ns) 88.48 ns ▁▁▃█▇▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - objects (10) 6.15 ns/iter 6.10 ns █▃ (4.14 ns … 66.32 ns) 9.31 ns ▁▁▁▁▂███▆▅▃▂▁▁▁▁▁▁▁▁▁ [...set] - objects (100) 57.47 ns/iter 56.67 ns ▆█ (47.52 ns … 110.06 ns) 93.39 ns ▁▁▃██▃▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ``` **Node 24.12.0** ``` clk: ~3.30 GHz cpu: Apple M4 Max runtime: node 24.12.0 (arm64-darwin) benchmark avg (min … max) p75 p99 (min … top 1%) ------------------------------------------- ------------------------------- [...set] - integers (10) 28.19 ns/iter 13.03 ns █ (10.87 ns … 9.37 µs) 129.01 ns █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - integers (100) 159.41 ns/iter 96.19 ns █ (80.87 ns … 8.42 µs) 1.98 µs █▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - strings (10) 20.13 ns/iter 13.56 ns █ (10.92 ns … 3.82 µs) 105.83 ns █▅▂▁▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - strings (100) 138.56 ns/iter 92.29 ns █ (80.63 ns … 10.17 µs) 1.09 µs █▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - objects (10) 16.43 ns/iter 12.40 ns █ (11.07 ns … 5.99 µs) 39.03 ns ▄█▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ [...set] - objects (100) 108.58 ns/iter 97.82 ns █ (80.83 ns … 2.99 µs) 298.93 ns ▂█▅▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ``` **Summary** ```zig ┌────────────────┬────────────────┬───────────────┬─────────┐ │ Benchmark │ Before (1.3.6) │ After (1.3.7) │ Speedup │ ├────────────────┼────────────────┼───────────────┼─────────┤ │ integers (10) │ 51.70 ns │ 4.71 ns │ 11.0x │ ├────────────────┼────────────────┼───────────────┼─────────┤ │ integers (100) │ 394.07 ns │ 42.52 ns │ 9.3x │ ├────────────────┼────────────────┼───────────────┼─────────┤ │ strings (10) │ 53.86 ns │ 6.02 ns │ 8.9x │ ├────────────────┼────────────────┼───────────────┼─────────┤ │ strings (100) │ 422.12 ns │ 56.81 ns │ 7.4x │ ├────────────────┼────────────────┼───────────────┼─────────┤ │ objects (10) │ 54.07 ns │ 6.15 ns │ 8.8x │ ├────────────────┼────────────────┼───────────────┼─────────┤ │ objects (100) │ 446.81 ns │ 57.47 ns │ 7.8x │ └────────────────┴────────────────┴───────────────┴─────────┘ ``` --- bench/snippets/spread-set.mjs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 bench/snippets/spread-set.mjs diff --git a/bench/snippets/spread-set.mjs b/bench/snippets/spread-set.mjs new file mode 100644 index 0000000000..2b150fe986 --- /dev/null +++ b/bench/snippets/spread-set.mjs @@ -0,0 +1,20 @@ +// Benchmark for [...set] optimization (WebKit#56539) +// https://github.com/WebKit/WebKit/pull/56539 +import { bench, run } from "../runner.mjs"; + +const intSet10 = new Set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); +const intSet100 = new Set(Array.from({ length: 100 }, (_, i) => i)); +const strSet10 = new Set(Array.from({ length: 10 }, (_, i) => `key-${i}`)); +const strSet100 = new Set(Array.from({ length: 100 }, (_, i) => `key-${i}`)); + +const objSet10 = new Set(Array.from({ length: 10 }, (_, i) => ({ id: i }))); +const objSet100 = new Set(Array.from({ length: 100 }, (_, i) => ({ id: i }))); + +bench("[...set] - integers (10)", () => [...intSet10]); +bench("[...set] - integers (100)", () => [...intSet100]); +bench("[...set] - strings (10)", () => [...strSet10]); +bench("[...set] - strings (100)", () => [...strSet100]); +bench("[...set] - objects (10)", () => [...objSet10]); +bench("[...set] - objects (100)", () => [...objSet100]); + +await run();