diff --git a/README.md b/README.md index ce811c03..9a1278bb 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,226 @@ is profitable. See the [repository rules](AGENTS.md#performance-reporting) and [next optimization targets](docs/PERFORMANCE_NEXT.md). -**Complete 35-scenario Linux x86_64 matrix, measured 2026-09-30: V8/Bun roadmap P0–P4.** +**Complete 35-scenario Linux x86_64 matrix, measured 2026-09-30: 0.12.11 gpui-shell tiering fixes.** + +The measured candidate is revision `8fa2a48` (branch `fix/shell-tiering-regression`). It fixes +the 0.12.10 regression in real gpui-shell renders: exhausted Tier2 profitability retries no longer +return long-running Baselines to the interpreter, the funded Tier2 trial is compiled first, +retries follow their backoff without host polling, and automatic tiering again keeps the opcodes +Tier 1 gained in roadmap P2 (closures, generic operators, exception regions, for-in/for-of) +interpreted until profitability can measure the interpreter. The previous-JIT baseline is the +v0.12.10 runtime (`889f7c1`, the same frozen binary as the historical roadmap matrix below). +QuickJS is the candidate binary with the JIT detached, so the profitability comparison uses the +same QuickJS-NG `fd0a0210b7be00957751871e7e01b8291268fc29` runtime and benchmark harness. Bun 1.4.0 +runs the same JavaScript from a file wrapper with default flags. + +Relative to the previous automatic JIT, 8 scenarios are significantly faster, 11 are +significantly slower, and 16 are statistically tied. The large losses are the deliberate P2 +deferral: `exceptions-sync` runs at 0.21x and `for-of-array` at 0.36x the speed of 0.12.10, back to +same-version QuickJS speed (0.98x and 1.00x). The other nine slower scenarios are between 0.5% and +3.6% slower; for `strings-regexp`, `methods-dynamic` and `calls-closures` the unchanged interpreter +moved by a similar amount. Relative to same-version QuickJS, 23 are faster, 5 are slower +(`collections`, `strings-json`, `json-codec`, `map-set-bigint`, `exceptions-promises-async`), and 7 +are tied. Relative to Bun, all 35 are slower: the closest are `fibonacci-recursive` (0.73x Bun +speed), `generic-call-entry` (0.63x), `float64-dense` (0.62x) and `quickjs-bitops` (0.58x); the +widest gaps are `methods-dynamic` (0.012x), `calls-recursion-closures` (0.020x), `arrays-typed` +(0.024x) and `objects-polymorphic` (0.026x). The tables retain every losing, fallback-only and +inconclusive scenario. + +How to read the table: + +- **QuickJS / Bun / quickjs-jit**: latency in ms per ten workload calls (lower is better) — the median over + processes of each process's upper-median of 16 timed batches. +- **vs QuickJS / vs Bun**: quickjs-jit speed as a multiple of that engine's speed + (that engine's latency / quickjs-jit latency, paired geometric mean). `49.2x (faster)` means + quickjs-jit runs 49.2 times as fast; `0.53x (slower)` means it runs at 0.53 times that engine's + speed. *faster* / *slower* means the 95% confidence interval lies entirely above / below 1.00x; + *tied* means it crosses 1.00x. +- QuickJS is the candidate binary with the JIT detached; quickjs-jit uses production automatic + tiering. Ratios use one decimal place from 1.1x and two decimals below it. + +| Workload | QuickJS | Bun | quickjs‑jit | vs QuickJS | vs Bun | +| --- | ---: | ---: | ---: | ---: | ---: | +| scalar‑control‑flow | 2.13 | 0.0238 | 0.0434 | 49.2x (faster) | 0.53x (slower) | +| scalar‑expressions | 2.16 | 0.0201 | 0.0456 | 47.4x (faster) | 0.43x (slower) | +| host‑compute | 2.16 | 0.0287 | 0.0512 | 42.3x (faster) | 0.55x (slower) | +| mixed‑quotes | 2.77 | 0.0588 | 0.648 | 4.3x (faster) | 0.091x (slower) | +| quickjs‑int‑arith | 5.8 | 0.0477 | 0.319 | 18.3x (faster) | 0.15x (slower) | +| quickjs‑bitops | 1.19 | 0.0159 | 0.0281 | 42.6x (faster) | 0.58x (slower) | +| quickjs‑fibonacci | 0.947 | 0.0132 | 0.377 | 2.5x (faster) | 0.035x (slower) | +| numeric | 0.539 | 0.0115 | 0.0211 | 26.6x (faster) | 0.56x (slower) | +| scalar‑loop | 0.539 | 0.0114 | 0.0211 | 26.5x (faster) | 0.56x (slower) | +| call‑heavy | 1.29 | 0.0207 | 0.0388 | 33.1x (faster) | 0.51x (slower) | +| generic‑call‑entry | 0.972 | 0.017 | 0.026 | 36.4x (faster) | 0.63x (slower) | +| generic‑call‑fallback | 1.29 | 0.0199 | 0.205 | 6.3x (faster) | 0.099x (slower) | +| property‑heavy | 1.07 | 0.0095 | 0.0281 | 37.8x (faster) | 0.44x (slower) | +| fibonacci‑iterative | 35.6 | 0.181 | 0.762 | 45.8x (faster) | 0.22x (slower) | +| fibonacci‑recursive | 9.91 | 0.266 | 0.361 | 27.1x (faster) | 0.73x (slower) | +| collections | 1.58 | 0.0399 | 1.6 | 0.98x (slower) | 0.026x (slower) | +| for‑of‑array | 0.459 | 0.0423 | 0.464 | 1.00x (tied) | 0.067x (slower) | +| strings‑json | 1.91 | 0.0713 | 2 | 0.96x (slower) | 0.038x (slower) | +| calls‑closures | 3.24 | 0.0938 | 3.21 | 1.00x (tied) | 0.03x (slower) | +| adversarial | 0.937 | 0.0361 | 0.951 | 1.00x (tied) | 0.038x (slower) | +| float64‑dense | 2.3 | 0.0655 | 0.106 | 22.2x (faster) | 0.62x (slower) | +| strings‑regexp | 19.7 | 1.03 | 20.3 | 1.02x (tied) | 0.053x (slower) | +| arrays‑typed | 4.17 | 0.0454 | 1.9 | 2.2x (faster) | 0.024x (slower) | +| packed‑array‑traversal | 0.827 | 0.0151 | 0.0303 | 26.7x (faster) | 0.48x (slower) | +| int32array‑traversal | 1.03 | 0.015 | 0.0279 | 37.1x (faster) | 0.53x (slower) | +| float64array‑traversal | 1.52 | 0.0083 | 0.0568 | 26.9x (faster) | 0.15x (slower) | +| typed‑convert‑traversal | 1.51 | 0.00812 | 0.0569 | 26.9x (faster) | 0.14x (slower) | +| objects‑polymorphic | 6.26 | 0.122 | 4.79 | 1.3x (faster) | 0.026x (slower) | +| property‑polymorphic | 1.86 | 0.0234 | 0.565 | 3.3x (faster) | 0.041x (slower) | +| calls‑recursion‑closures | 6.47 | 0.126 | 6.61 | 1.00x (tied) | 0.02x (slower) | +| json‑codec | 78.6 | 7.77 | 81.5 | 0.96x (slower) | 0.098x (slower) | +| map‑set‑bigint | 17.7 | 0.838 | 18.1 | 0.99x (slower) | 0.047x (slower) | +| exceptions‑promises‑async | 2.35 | 0.207 | 2.42 | 0.98x (slower) | 0.086x (slower) | +| methods‑dynamic | 13.6 | 0.151 | 13.4 | 1.02x (tied) | 0.012x (slower) | +| exceptions‑sync | 2.93 | 0.366 | 2.94 | 0.98x (tied) | 0.12x (slower) | + +
+95% confidence intervals and statistically tied results + +Each cell is quickjs-jit's speed ratio followed by its 95% confidence interval. *vs previous* +compares with the v0.12.10 automatic JIT. Exact values, including the interpreter-control +intervals, are in the machine-readable comparisons. + +| Workload | vs QuickJS | vs Bun | vs previous | +| --- | ---: | ---: | ---: | +| scalar‑control‑flow | 49.2x [49.1, 49.2] | 0.53x [0.49, 0.55] | 1.01x [1.00, 1.01] | +| scalar‑expressions | 47.4x [47.4, 47.4] | 0.43x [0.40, 0.44] | 0.99x [0.99, 0.99] | +| host‑compute | 42.3x [42.0, 42.5] | 0.55x [0.54, 0.56] | 1.04x [1.01, 1.07] | +| mixed‑quotes | 4.3x [4.3, 4.3] | 0.091x [0.091, 0.092] | 0.99x [0.99, 0.99] | +| quickjs‑int‑arith | 18.3x [18.2, 18.5] | 0.15x [0.15, 0.15] | 1.00x [1.00, 1.00] | +| quickjs‑bitops | 42.6x [42.5, 42.7] | 0.58x [0.57, 0.60] | 1.00x [0.99, 1.00] | +| quickjs‑fibonacci | 2.5x [2.5, 2.5] | 0.035x [0.035, 0.036] | 0.99x [0.99, 1.00] | +| numeric | 26.6x [26.0, 27.4] | 0.56x [0.52, 0.59] | 1.04x [1.01, 1.07] | +| scalar‑loop | 26.5x [25.8, 27.3] | 0.56x [0.55, 0.58] | 1.03x [1.00, 1.06] | +| call‑heavy | 33.1x [33.0, 33.2] | 0.51x [0.47, 0.53] | 1.00x [1.00, 1.01] | +| generic‑call‑entry | 36.4x [35.8, 37.0] | 0.63x [0.57, 0.67] | 0.98x [0.96, 1.00] | +| generic‑call‑fallback | 6.3x [6.3, 6.3] | 0.099x [0.088, 0.11] | 1.00x [1.00, 1.01] | +| property‑heavy | 37.8x [37.5, 38.1] | 0.44x [0.37, 0.53] | 1.00x [0.99, 1.01] | +| fibonacci‑iterative | 45.8x [43.8, 47.0] | 0.22x [0.21, 0.23] | 1.01x [0.97, 1.03] | +| fibonacci‑recursive | 27.1x [26.9, 27.4] | 0.73x [0.72, 0.74] | 1.00x [0.99, 1.02] | +| collections | 0.98x [0.98, 0.99] | 0.026x [0.025, 0.027] | 1.01x [0.99, 1.04] | +| for‑of‑array | 1.00x [0.95, 1.05] | 0.067x [0.056, 0.078] | 0.36x [0.35, 0.38] | +| strings‑json | 0.96x [0.95, 0.96] | 0.038x [0.037, 0.039] | 1.00x [0.99, 1.01] | +| calls‑closures | 1.00x [0.98, 1.01] | 0.03x [0.029, 0.032] | 0.99x [0.97, 1.00] | +| adversarial | 1.00x [0.97, 1.03] | 0.038x [0.037, 0.038] | 1.01x [0.99, 1.03] | +| float64‑dense | 22.2x [21.5, 22.9] | 0.62x [0.61, 0.63] | 0.97x [0.95, 0.99] | +| strings‑regexp | 1.02x [0.98, 1.08] | 0.053x [0.051, 0.056] | 0.96x [0.92, 0.99] | +| arrays‑typed | 2.2x [2.2, 2.2] | 0.024x [0.024, 0.025] | 1.00x [0.99, 1.00] | +| packed‑array‑traversal | 26.7x [26.3, 27.0] | 0.48x [0.47, 0.50] | 0.98x [0.97, 1.00] | +| int32array‑traversal | 37.1x [36.6, 37.6] | 0.53x [0.52, 0.54] | 1.02x [1.01, 1.03] | +| float64array‑traversal | 26.9x [26.7, 27.0] | 0.15x [0.15, 0.15] | 1.01x [1.01, 1.02] | +| typed‑convert‑traversal | 26.9x [26.4, 27.9] | 0.14x [0.14, 0.15] | 1.01x [0.99, 1.02] | +| objects‑polymorphic | 1.3x [1.2, 1.4] | 0.026x [0.025, 0.027] | 0.98x [0.93, 1.01] | +| property‑polymorphic | 3.3x [3.3, 3.3] | 0.041x [0.041, 0.041] | 1.00x [1.00, 1.01] | +| calls‑recursion‑closures | 1.00x [0.98, 1.03] | 0.02x [0.019, 0.021] | 1.00x [0.99, 1.03] | +| json‑codec | 0.96x [0.95, 0.97] | 0.098x [0.095, 0.10] | 1.01x [0.99, 1.04] | +| map‑set‑bigint | 0.99x [0.98, 1.00] | 0.047x [0.047, 0.048] | 0.97x [0.97, 0.98] | +| exceptions‑promises‑async | 0.98x [0.97, 0.98] | 0.086x [0.085, 0.086] | 1.02x [1.00, 1.06] | +| methods‑dynamic | 1.02x [1.00, 1.04] | 0.012x [0.011, 0.013] | 0.98x [0.96, 0.99] | +| exceptions‑sync | 0.98x [0.94, 1.00] | 0.12x [0.12, 0.12] | 0.21x [0.20, 0.22] | + +Statistically tied: `quickjs-int-arith` vs previous JIT (between 0.4% slower and 0.2% faster); `quickjs-bitops` vs previous JIT (between 0.7% slower and 0.2% faster); `call-heavy` vs previous JIT (between 0.0% slower and 0.6% faster); `generic-call-entry` vs previous JIT (between 3.5% slower and 0.3% faster); `property-heavy` vs previous JIT (between 0.7% slower and 1.4% faster); `fibonacci-iterative` vs previous JIT (between 3.5% slower and 3.2% faster); `fibonacci-recursive` vs previous JIT (between 1.2% slower and 1.8% faster); `collections` vs previous JIT (between 1.2% slower and 3.7% faster); `for-of-array` vs QuickJS (between 4.8% slower and 4.7% faster); `strings-json` vs previous JIT (between 1.1% slower and 0.8% faster); `calls-closures` vs QuickJS (between 1.8% slower and 0.8% faster); `adversarial` vs QuickJS (between 2.7% slower and 2.9% faster); `adversarial` vs previous JIT (between 1.4% slower and 3.1% faster); `strings-regexp` vs QuickJS (between 2.5% slower and 8.4% faster); `arrays-typed` vs previous JIT (between 0.7% slower and 0.5% faster); `typed-convert-traversal` vs previous JIT (between 0.9% slower and 2.2% faster); `objects-polymorphic` vs previous JIT (between 6.6% slower and 1.0% faster); `property-polymorphic` vs previous JIT (between 0.2% slower and 0.9% faster); `calls-recursion-closures` vs QuickJS (between 1.8% slower and 2.6% faster); `calls-recursion-closures` vs previous JIT (between 1.3% slower and 2.6% faster); `json-codec` vs previous JIT (between 1.3% slower and 4.0% faster); `methods-dynamic` vs QuickJS (between 0.4% slower and 3.7% faster); `exceptions-sync` vs QuickJS (between 5.7% slower and 0.3% faster). + +Statistically tied interpreter controls: `scalar-control-flow` (between 0.2% slower and 0.0% faster); `host-compute` (between 0.1% slower and 0.6% faster); `mixed-quotes` (between 0.3% slower and 0.2% faster); `quickjs-int-arith` (between 1.5% slower and 0.2% faster); `quickjs-bitops` (between 0.2% slower and 0.0% faster); `quickjs-fibonacci` (between 0.2% slower and 3.1% faster); `numeric` (between 0.3% slower and 0.3% faster); `scalar-loop` (between 0.4% slower and 0.0% faster); `call-heavy` (between 0.4% slower and 0.5% faster); `generic-call-entry` (between 0.2% slower and 0.1% faster); `property-heavy` (between 0.2% slower and 0.1% faster); `fibonacci-iterative` (between 0.5% slower and 0.1% faster); `fibonacci-recursive` (between 0.1% slower and 0.5% faster); `collections` (between 0.3% slower and 0.8% faster); `for-of-array` (between 6.2% slower and 1.0% faster); `strings-json` (between 1.8% slower and 0.2% faster); `float64-dense` (between 2.9% slower and 3.1% faster); `arrays-typed` (between 1.4% slower and 0.1% faster); `packed-array-traversal` (between 0.2% slower and 0.2% faster); `int32array-traversal` (between 1.5% slower and 1.1% faster); `typed-convert-traversal` (between 5.9% slower and 1.3% faster); `objects-polymorphic` (between 5.1% slower and 7.5% faster); `calls-recursion-closures` (between 3.5% slower and 0.3% faster); `json-codec` (between 1.3% slower and 1.2% faster); `exceptions-promises-async` (between 0.5% slower and 0.7% faster); `methods-dynamic` (between 3.7% slower and 0.4% faster); `exceptions-sync` (between 0.7% slower and 0.4% faster). + +
+ +**gpui-shell host regression.** The matrix protocol polls the JIT after every batch and warms +640 calls before timing, so it cannot observe tier-up latency or host-call overhead in an embedder +that never polls. The regression and its fix are measured with gpui-shell's own +`emit_one_jit_acceptance_sample` (gpui-kit `2c2feb76`): each fresh process renders 64 warmup +frames, then the mean of 200 measured renders (µs per render, including the snapshot check). +Ten retained process pairs per configuration (two discarded), alternating order; `1` core pins the +render thread and the JIT worker to CPU 8, `2` cores to CPUs 8 and 10. Checksums agree in every +process; the candidate recorded no fallbacks or deopts. These host-inclusive timings are never +divided by a Bun timing; `host-compute` above is the equivalent pure-JavaScript kernel. + +| Workload | Cores | 0.12.9 | 0.12.10 | quickjs‑jit | vs 0.12.9 | vs 0.12.10 | +| --- | --- | ---: | ---: | ---: | ---: | ---: | +| compute | 1 | 15.1 | 127.1 | 10.3 | 1.5x (faster) | 12.3x (faster) | +| compute | 2 | 16.3 | 62.4 | 10.2 | 1.6x (faster) | 6.6x (faster) | +| mixed | 1 | 178.5 | 363.3 | 92.7 | 1.9x (faster) | 3.9x (faster) | +| mixed | 2 | 179.2 | 180.1 | 92.4 | 1.9x (faster) | 2.0x (faster) | +| panel | 1 | 812.0 | 981.4 | 803.7 | 1.03x (faster) | 1.3x (faster) | +| panel | 2 | 806.9 | 987.9 | 805.5 | 1.00x (tied) | 1.2x (faster) | + +Statistically tied: `panel` on 2 cores vs 0.12.9 (between 1.1% slower and 0.4% faster). + +Protocol `shared-js-multibatch-v3`: each fresh process performs one initial call, 64 untimed +ten-call warmup batches, then 16 timed ten-call batches; the process latency is the upper +median of those batches. Result consumption and the checksum are outside the timed boundary, +and inputs, scripts and driver (`60408ad6…`) are equivalent across engines; every checksum +agrees. Each workload/configuration has five discarded and 30 retained processes, and +configuration order reverses on alternating pairs. All 6,125 process records are archived; +timing samples are not filtered by native readiness and outlier batches are counted, never +dropped. Confidence intervals use 10,000 deterministic paired percentile-bootstrap resamples +(seed 20260909). v3 timings are not comparable with the historical v2 matrices below. + +**Regression and diagnostics** — *vs previous*: quickjs-jit speed as a multiple of the v0.12.10 +automatic JIT. *Interpreter*: candidate / previous interpreter speed (identical interpreter code, +so this is the measurement's noise control). *Entries*: native entries in the first timed batch +(counts include the shared driver). *Quiet*: processes out of 30 with no compilation or +installation during the timed window. *Outliers*: timed batches slower than 5x the median +(affected processes). + +| Workload | vs previous | Interpreter | Entries | Quiet | Outliers | +| --- | ---: | ---: | ---: | ---: | ---: | +| scalar‑control‑flow | 1.01x (faster) | 1.00x (tied) | 20 | 30 | 0 (0) | +| scalar‑expressions | 0.99x (slower) | 1.00x (slower) | 10–20 | 29 | 0 (0) | +| host‑compute | 1.04x (faster) | 1.00x (tied) | 20 | 30 | 0 (0) | +| mixed‑quotes | 0.99x (slower) | 1.00x (tied) | 6990 | 30 | 0 (0) | +| quickjs‑int‑arith | 1.00x (tied) | 1.00x (tied) | 20 | 30 | 0 (0) | +| quickjs‑bitops | 1.00x (tied) | 1.00x (tied) | 20 | 30 | 0 (0) | +| quickjs‑fibonacci | 0.99x (slower) | 1.01x (tied) | 20 | 30 | 0 (0) | +| numeric | 1.04x (faster) | 1.00x (tied) | 10–20 | 9 | 10 (10) | +| scalar‑loop | 1.03x (faster) | 1.00x (tied) | 10–20 | 13 | 9 (9) | +| call‑heavy | 1.00x (tied) | 1.00x (tied) | 10 | 27 | 3 (3) | +| generic‑call‑entry | 0.98x (tied) | 1.00x (tied) | 10 | 17 | 3 (3) | +| generic‑call‑fallback | 1.00x (faster) | 1.00x (faster) | 10 | 30 | 0 (0) | +| property‑heavy | 1.00x (tied) | 1.00x (tied) | 10 | 28 | 1 (1) | +| fibonacci‑iterative | 1.01x (tied) | 1.00x (tied) | 20 | 30 | 0 (0) | +| fibonacci‑recursive | 1.00x (tied) | 1.00x (tied) | 20 | 30 | 0 (0) | +| collections | 1.01x (tied) | 1.00x (tied) | 10 | 30 | 0 (0) | +| for‑of‑array | 0.36x (slower) | 0.98x (tied) | 10 | 30 | 0 (0) | +| strings‑json | 1.00x (tied) | 0.99x (tied) | 10 | 30 | 0 (0) | +| calls‑closures | 0.99x (slower) | 0.99x (slower) | 10 | 30 | 0 (0) | +| adversarial | 1.01x (tied) | 0.98x (slower) | 10 | 30 | 0 (0) | +| float64‑dense | 0.97x (slower) | 1.00x (tied) | 20 | 4 | 29 (26) | +| strings‑regexp | 0.96x (slower) | 0.94x (slower) | 10 | 30 | 0 (0) | +| arrays‑typed | 1.00x (tied) | 0.99x (tied) | 30 | 30 | 0 (0) | +| packed‑array‑traversal | 0.98x (slower) | 1.00x (tied) | 10 | 17 | 7 (7) | +| int32array‑traversal | 1.02x (faster) | 1.00x (tied) | 10 | 28 | 1 (1) | +| float64array‑traversal | 1.01x (faster) | 0.99x (slower) | 10 | 30 | 0 (0) | +| typed‑convert‑traversal | 1.01x (tied) | 0.98x (tied) | 10 | 30 | 0 (0) | +| objects‑polymorphic | 0.98x (tied) | 1.01x (tied) | 20 | 30 | 0 (0) | +| property‑polymorphic | 1.00x (tied) | 1.00x (faster) | 10 | 30 | 0 (0) | +| calls‑recursion‑closures | 1.00x (tied) | 0.99x (tied) | 10 | 30 | 0 (0) | +| json‑codec | 1.01x (tied) | 1.00x (tied) | 10 | 30 | 0 (0) | +| map‑set‑bigint | 0.97x (slower) | 0.99x (slower) | 10 | 30 | 0 (0) | +| exceptions‑promises‑async | 1.02x (faster) | 1.00x (tied) | 10 | 30 | 0 (0) | +| methods‑dynamic | 0.98x (slower) | 0.98x (tied) | 10 | 30 | 0 (0) | +| exceptions‑sync | 0.21x (slower) | 1.00x (tied) | 10 | 30 | 0 (0) | + +Host: 13th Gen Intel Core i7-13700KF, Linux 7.2.5 x86_64, CPU 8 pinned, `powersave` +governor. Toolchain: rustc 1.98.1 / LLVM 22.1.8. Bun 1.4.0, default flags. Candidate binary +`5283ef08…`, previous binary `d0ba09cf…`. + +[All raw process records and metadata](benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.tar.gz), +[machine-readable comparisons](benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.json), +[collection metadata](benchmarks/results/shell-tiering-8fa2a48-metadata-x86_64.json), +[gpui-shell comparisons](benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.json) and +[raw samples](benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.tar.gz), and +[verified hashes and provenance](benchmarks/results/shell-tiering-8fa2a48-manifest-x86_64.json). + + + + +**Historical 35-scenario Linux x86_64 matrix, measured 2026-09-30: V8/Bun roadmap P0–P4 (v0.12.10).** +These measurements apply only to the `889f7c1` (v0.12.10) runtime. Its automatic tiering regressed +real gpui-shell renders, which the current matrix above fixes. The measured candidate is `main` revision `889f7c19adb46976e98ff00729d606d77cd933d2` (PR #30). The previous-JIT regression baseline is the `82d3808` (v0.12.9) runtime built with the @@ -264,7 +483,7 @@ host-inclusive timing. [collection metadata](benchmarks/results/roadmap-889f7c1-metadata-x86_64.json), and [verified hashes and provenance](benchmarks/results/roadmap-889f7c1-manifest-x86_64.json). - + diff --git a/benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.json b/benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.json new file mode 100644 index 00000000..8cbe4f6d --- /dev/null +++ b/benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.json @@ -0,0 +1,416 @@ +{ + "schema": "gpui-shell-paired-v1", + "measured_at": "2026-09-30", + "candidate_revision": "8fa2a4894eb6148bb096b2f2e154ac9e661fd848", + "gpui_kit_base": "2c2feb769115530f56d6478d5bb78840131888d0", + "test": "gpui_shell tests::benchmark::emit_one_jit_acceptance_sample (64 warmup renders, 200 measured renders, steady_state_ns = mean render incl. debug_tree check)", + "pairs_retained": 10, + "pairs_discarded": 2, + "order": "alternating reversed per pair", + "bootstrap": { + "resamples": 10000, + "seed": 20260909 + }, + "host": "13th Gen Intel(R) Core(TM) i7-13700KF; Linux-7.2.5-3-omarchy-x86_64-with-glibc2.44", + "binaries": { + "shell-0.12.10": "9312c2350e43036c434bb5e017ed2594a507aa277f0785a4c220a78adc6a1f69", + "shell-0.12.9": "6d587472b052881af056fdc0e896385e6fe267d2a5adee7709913d2f96268d1c", + "shell-fix-8fa2a48": "7215580eb853ba16a60c3f9302a78e05b940911abc79cef5629e231254ea09f4" + }, + "runs": { + "s5-1core": { + "cpus": "taskset -c 8 (main and JIT worker share one core)", + "workloads": { + "panel": { + "steady_state_ns": { + "median_us": { + "0.12.9/automatic": 811.9595, + "0.12.10/automatic": 981.3785, + "fix-8fa2a48/automatic": 803.707, + "fix-8fa2a48/interpreter": 801.492 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.029093503035186, + "ci95": [ + 1.002072000983406, + 1.0733399737197922 + ] + }, + "0.12.10/automatic": { + "speed": 1.2744751927982882, + "ci95": [ + 1.217950547032757, + 1.3887305251464916 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 0.9979116295204772, + "ci95": [ + 0.992449960090909, + 1.0059846146474565 + ] + } + } + }, + "p99_script_render_ns": { + "median_us": { + "0.12.9/automatic": 875.193, + "0.12.10/automatic": 1011.065, + "fix-8fa2a48/automatic": 832.4485, + "fix-8fa2a48/interpreter": 819.871 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.0826750483138468, + "ci95": [ + 1.0004860357022247, + 1.1968062902786702 + ] + }, + "0.12.10/automatic": { + "speed": 1.3181958838082963, + "ci95": [ + 1.222738199773299, + 1.4593374155153795 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 1.003138745276263, + "ci95": [ + 0.9898805117451944, + 1.0187771831585815 + ] + } + } + } + }, + "compute": { + "steady_state_ns": { + "median_us": { + "0.12.9/automatic": 15.0915, + "0.12.10/automatic": 127.1345, + "fix-8fa2a48/automatic": 10.298, + "fix-8fa2a48/interpreter": 222.7165 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.4655148524486266, + "ci95": [ + 1.298509503136378, + 1.6503896211250244 + ] + }, + "0.12.10/automatic": { + "speed": 12.32684282988836, + "ci95": [ + 11.974675526994039, + 12.685095524544064 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 21.594814928126894, + "ci95": [ + 21.41847466710368, + 21.772413002885486 + ] + } + } + }, + "p99_script_render_ns": { + "median_us": { + "0.12.9/automatic": 16.468, + "0.12.10/automatic": 2051.2615, + "fix-8fa2a48/automatic": 12.642, + "fix-8fa2a48/interpreter": 226.6705 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.338736342792241, + "ci95": [ + 1.1758461044109265, + 1.5302644249903152 + ] + }, + "0.12.10/automatic": { + "speed": 154.56165975580862, + "ci95": [ + 148.69577185223503, + 160.93433000604705 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 17.591889100829608, + "ci95": [ + 16.866828173429003, + 18.271631015589637 + ] + } + } + } + }, + "mixed": { + "steady_state_ns": { + "median_us": { + "0.12.9/automatic": 178.48, + "0.12.10/automatic": 363.262, + "fix-8fa2a48/automatic": 92.7135, + "fix-8fa2a48/interpreter": 306.9695 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.9024628163101225, + "ci95": [ + 1.8793374699610848, + 1.9243759834971732 + ] + }, + "0.12.10/automatic": { + "speed": 3.913926363876618, + "ci95": [ + 3.8751377665192996, + 3.9548032555420605 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 3.2970890370169217, + "ci95": [ + 3.2719649250528136, + 3.3152906677934397 + ] + } + } + }, + "p99_script_render_ns": { + "median_us": { + "0.12.9/automatic": 183.2, + "0.12.10/automatic": 2231.4975, + "fix-8fa2a48/automatic": 97.529, + "fix-8fa2a48/interpreter": 315.1215 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.750264822166015, + "ci95": [ + 1.5435245501012138, + 1.8893327387085466 + ] + }, + "0.12.10/automatic": { + "speed": 21.22569682762332, + "ci95": [ + 18.401448367447678, + 24.252105930579713 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 3.067596968058854, + "ci95": [ + 2.7101560595443916, + 3.290974243154774 + ] + } + } + } + } + } + }, + "s5-2core": { + "cpus": "taskset -c 8,10 (two physical P-cores)", + "workloads": { + "panel": { + "steady_state_ns": { + "median_us": { + "0.12.9/automatic": 806.8725, + "0.12.10/automatic": 987.911, + "fix-8fa2a48/automatic": 805.549, + "fix-8fa2a48/interpreter": 798.957 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 0.9973158359601578, + "ci95": [ + 0.9889171369674501, + 1.003636469860589 + ] + }, + "0.12.10/automatic": { + "speed": 1.224514889057869, + "ci95": [ + 1.2131424423067076, + 1.2357418779926679 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 0.9925664553685941, + "ci95": [ + 0.99063567531783, + 0.9946375245736212 + ] + } + } + }, + "p99_script_render_ns": { + "median_us": { + "0.12.9/automatic": 824.455, + "0.12.10/automatic": 1008.3785, + "fix-8fa2a48/automatic": 845.3685, + "fix-8fa2a48/interpreter": 825.255 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 0.9512525571819852, + "ci95": [ + 0.9192364769445204, + 0.9809386099733595 + ] + }, + "0.12.10/automatic": { + "speed": 1.2055080390203756, + "ci95": [ + 1.1585011631150928, + 1.2551211073477326 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 0.960716142879846, + "ci95": [ + 0.9395567816327389, + 0.9785656656336412 + ] + } + } + } + }, + "compute": { + "steady_state_ns": { + "median_us": { + "0.12.9/automatic": 16.286, + "0.12.10/automatic": 62.405, + "fix-8fa2a48/automatic": 10.2375, + "fix-8fa2a48/interpreter": 223.0215 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.6426642573206784, + "ci95": [ + 1.4070216073344337, + 1.9420142487252121 + ] + }, + "0.12.10/automatic": { + "speed": 6.619499879036475, + "ci95": [ + 5.321746380358696, + 8.305979176190888 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 21.750109473926813, + "ci95": [ + 21.640682585360643, + 21.849052835554012 + ] + } + } + }, + "p99_script_render_ns": { + "median_us": { + "0.12.9/automatic": 15.8365, + "0.12.10/automatic": 439.6995, + "fix-8fa2a48/automatic": 11.3975, + "fix-8fa2a48/interpreter": 227.103 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 2.680194367474053, + "ci95": [ + 1.3571571464158232, + 6.3897172055151445 + ] + }, + "0.12.10/automatic": { + "speed": 50.116072531222734, + "ci95": [ + 36.29685724902885, + 76.49065183214856 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 19.794590946655187, + "ci95": [ + 18.342405233310934, + 20.980984692575614 + ] + } + } + } + }, + "mixed": { + "steady_state_ns": { + "median_us": { + "0.12.9/automatic": 179.2105, + "0.12.10/automatic": 180.071, + "fix-8fa2a48/automatic": 92.4385, + "fix-8fa2a48/interpreter": 306.213 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 1.9390596610819413, + "ci95": [ + 1.916314623243905, + 1.9618510710298518 + ] + }, + "0.12.10/automatic": { + "speed": 1.992455421407972, + "ci95": [ + 1.774041846898373, + 2.2245637947042134 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 3.3192375402372187, + "ci95": [ + 3.305148326588638, + 3.3372177721529326 + ] + } + } + }, + "p99_script_render_ns": { + "median_us": { + "0.12.9/automatic": 182.092, + "0.12.10/automatic": 334.298, + "fix-8fa2a48/automatic": 95.0065, + "fix-8fa2a48/interpreter": 311.4405 + }, + "fix_speed_vs": { + "0.12.9/automatic": { + "speed": 2.047715086698208, + "ci95": [ + 1.884629203250106, + 2.351323790833418 + ] + }, + "0.12.10/automatic": { + "speed": 4.4243064965165635, + "ci95": [ + 3.5398084456572256, + 5.686552671000553 + ] + }, + "fix-8fa2a48/interpreter": { + "speed": 3.3633497925915026, + "ci95": [ + 3.2419401221298747, + 3.5327797675095645 + ] + } + } + } + } + } + } + } +} diff --git a/benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.tar.gz b/benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.tar.gz new file mode 100644 index 00000000..0019e9d5 Binary files /dev/null and b/benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.tar.gz differ diff --git a/benchmarks/results/shell-tiering-8fa2a48-manifest-x86_64.json b/benchmarks/results/shell-tiering-8fa2a48-manifest-x86_64.json new file mode 100644 index 00000000..e5647224 --- /dev/null +++ b/benchmarks/results/shell-tiering-8fa2a48-manifest-x86_64.json @@ -0,0 +1,85 @@ +{ + "schema": "quickjs-jit-benchmark-evidence-v1", + "measurement": { + "candidate_revision": "8fa2a4894eb6148bb096b2f2e154ac9e661fd848", + "previous_revision": "889f7c19adb46976e98ff00729d606d77cd933d2 (v0.12.10 runtime; same binary as the roadmap-889f7c1 candidate)", + "quickjs_ng_revision": "fd0a0210b7be00957751871e7e01b8291268fc29", + "candidate_binary_sha256": "5283ef085fa826d3df6997f5dd8db0449214c15a80604f6bfdca61ecdee02fe6", + "previous_binary_sha256": "d0ba09cf065584df34169eb10fd79d96d780c82ecf4857846b3ca192f665bb5b", + "cargo_lock_sha256": "3492a68195c23e95b643ff2a17b5280aca077b577f740cd41c0bc763866a6e35", + "collector_sha256": "20ff6c4cdab95a5c8ea39128bd2854fac9e8947d7baf1bbe13ef6722fa54fa03", + "driver_sha256": "60408ad6d28c58e7f20161c17a5db11fc142685fdd07ec7dbf35d7bb02a8f7c5", + "measured_at": "2026-09-30", + "protocol": "shared-js-multibatch-v3", + "timed_batches": 16, + "workloads": 35, + "configurations": [ + "previous/automatic", + "candidate/automatic", + "previous/interpreter", + "previous/bun", + "candidate/interpreter" + ], + "discarded_processes_per_workload_configuration": 5, + "retained_processes_per_workload_configuration": 30, + "total_process_records": 6125, + "bootstrap_resamples": 10000, + "bootstrap_seed": 20260909, + "timed_unit": "nanoseconds per ten workload calls (upper median of 16 timed batches)", + "host": "13th Gen Intel(R) Core(TM) i7-13700KF; Linux-7.2.5-3-omarchy-x86_64-with-glibc2.44; CPU 8 pinned; powersave", + "rustc": "rustc 1.98.1 (48a229cea 2026-09-01), LLVM 22.1.8", + "bun": { + "version": "1.4.0", + "sha256": "33d56b070be6a9e3da0ab013038b43d1645d0534ca811ecdba4472599117eb4b", + "flags": [] + } + }, + "host_regression": { + "file": "benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.json", + "raw": "benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.tar.gz" + }, + "files": { + "benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.tar.gz": "aba9043da941a2bb82a13cf62cb59cae3671b5f34857327c6e209da4dd936b3d", + "benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.json": "b0687fd179aa6478bfec2db3a216b07c6618882b07e3553b5260afb8a1adf578", + "benchmarks/results/shell-tiering-8fa2a48-metadata-x86_64.json": "472eed8abc2605a7f3fff13a0289d0524641d5abb1e06508c9e7d385b8cc4fde", + "benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.json": "336d8d89c5d40868e42525b6d560df68a3752b36e1772c914bc1514c9027339e", + "benchmarks/results/shell-tiering-8fa2a48-gpui-shell-x86_64.tar.gz": "ac058eeaa26a63b3104283f0b8abf4f03e8cc4a7a0f4f6b230431e70e48cf9d1" + }, + "script_sha256": { + "scalar-control-flow": "cd2a2d54c8be8fd1aab6f6b81a4b12a15d027bb05befae472561504e45fb787d", + "scalar-expressions": "248825299f0b5dedddd7f844ca74fbb5f779e08ba95a36b48d776c24c20be7dc", + "host-compute": "a09e06b167f1e823de480ea0f9d9d93236ed2565b998e81ac037b6438863bb7a", + "mixed-quotes": "1d670a5575e2f01ddf6c583ee0afb1e54e6f39743f4e6592a2dce43a4c04dc44", + "quickjs-int-arith": "483eb8091ff83632c1c58c91554a07dc180d95e5b9374b67002f83cc10632d2e", + "quickjs-bitops": "382fab47164d9a4e6bc2080140b41b40a797d967ef605345b07a22daad08e5c7", + "quickjs-fibonacci": "96ad95758210c1f9b99c5046a2e062a60d1415dceb58fdbf6173a1a28a1381e1", + "numeric": "71fccfc372ce1abc5229e79e390dec06a17b42f6a9f9f7a6747222f2df525f50", + "scalar-loop": "db9037d16bf51a21a033ddc5901eac1a70a80c51628a5a5a937327faf0ed8a45", + "call-heavy": "a6cc40c5fb963f376a4fd35469a59a23b37420c564756319bc6d9c19b35f8fb0", + "generic-call-entry": "1eb475e3de0557bda01a5166e4d782d826f227370c6d4f72e1cb92e330a2cc40", + "generic-call-fallback": "af1c8b8d3eb97968c1924927bdb5744c1678a2c9d82dec6f8b3f772451f12596", + "property-heavy": "10bf81e6d712b8980df2a404be0d0456de92df5afc22ae30e5c086a33dea30cb", + "fibonacci-iterative": "7f7c397e968bd4d88a70cd4eaad43e861f456f996bd93a2eecb3d583d31b39f4", + "fibonacci-recursive": "19af48c9602fd18c911d1d19daf48a3608209712f1205e7959680a0bf5fde3a0", + "collections": "5a28d974119bfa1c1200d4e28daef3c228bb7792e0055ed9f0b164c9a74712c6", + "for-of-array": "2b96c8573916dfb0f0bc02402afefc00ca63e581df42b69fbf43a1bb51055ecc", + "strings-json": "c4ddcd0f2b34ab1b76e5a6f9b09cc0b590a14097a8457f35d1c9c1de4295231e", + "calls-closures": "2b72055e0638c572fa69f75622c9308c1e7e220a0bf1b1a772e21e6af68b5b15", + "adversarial": "aba1b49b0439f72eacefdaeff63793256c9e9765b7deb202bc25191c4b5b5095", + "float64-dense": "35220498f859305ab3444f165af3e004136cc69c71bfb19683bbdce24db0163b", + "strings-regexp": "709bb01131e108922bf9843d561c74c2097e58ba2fe42988c079bc3683e50889", + "arrays-typed": "a19284a8c4e7613bfdee18131871f5865f62f05e893d188511209426a5b7687b", + "packed-array-traversal": "03ef60d655ca39319b88b22e3f5010cd6de55be0c755d97eeb2cc797b84cdb7c", + "int32array-traversal": "6fb7aa242ecd2edb3b000037521d8ff8880508f6ba532ad8ffb6441364f24750", + "float64array-traversal": "b558b5337e9bae384df4b8c9e7beabe7c584b446c093ee45cacee9e3216e61ba", + "typed-convert-traversal": "957a26e561c80d9cf153c9f9ac4b777e2f550cadcb360fb6aea839641bd9b990", + "objects-polymorphic": "0b43980bee67f25de8a453d191e113cd427f57b730b7f136435ca6ab4f9bbd69", + "property-polymorphic": "6f872085fbdc743ed1e81827fe39db71d33aec8b25bc7d1cee09fcf64f9758ea", + "calls-recursion-closures": "e2c2f192b5915b77c20f852feb6e21b15dbf879507ee851f4da514f9c9300757", + "json-codec": "36526695061ee1fa90c7bfee357064af6d28c11af1a00145bf28fe1712e268e3", + "map-set-bigint": "2ec0a33414b8c230cfd5028cf1a5aa769b3033da4f797fbb421ea63e1e66b954", + "exceptions-promises-async": "78236c5910b41a1e4d57aea88a78fd3941236b999793d605de8976a9cc6f99a1", + "methods-dynamic": "f358b173509f6aaa9f4f74b7d39b1e23391af24222829507e7da8a6347a4734d", + "exceptions-sync": "35f49e7fd970a16627cc2933673c53a20e4530ac5a151d03cdc1d5687045f9dd" + } +} diff --git a/benchmarks/results/shell-tiering-8fa2a48-metadata-x86_64.json b/benchmarks/results/shell-tiering-8fa2a48-metadata-x86_64.json new file mode 100644 index 00000000..82d4166c --- /dev/null +++ b/benchmarks/results/shell-tiering-8fa2a48-metadata-x86_64.json @@ -0,0 +1,101 @@ +{ + "cpu": "8", + "status": "complete", + "pairs": 30, + "discarded_processes": 5, + "binary_sha256": { + "previous": "d0ba09cf065584df34169eb10fd79d96d780c82ecf4857846b3ca192f665bb5b", + "candidate": "5283ef085fa826d3df6997f5dd8db0449214c15a80604f6bfdca61ecdee02fe6" + }, + "binaries": { + "previous": "/home/jason/work/quickjs-jit/target/bench-evidence/fix-8fa2a48/bins/previous-889f7c1-jit-bench", + "candidate": "/home/jason/work/quickjs-jit/target/bench-evidence/fix-8fa2a48/bins/candidate-8fa2a48-jit-bench" + }, + "configs": [ + [ + "previous", + "automatic" + ], + [ + "candidate", + "automatic" + ], + [ + "previous", + "interpreter" + ], + [ + "previous", + "bun" + ], + [ + "candidate", + "interpreter" + ] + ], + "scripts": { + "scalar-control-flow": "cd2a2d54c8be8fd1aab6f6b81a4b12a15d027bb05befae472561504e45fb787d", + "scalar-expressions": "248825299f0b5dedddd7f844ca74fbb5f779e08ba95a36b48d776c24c20be7dc", + "host-compute": "a09e06b167f1e823de480ea0f9d9d93236ed2565b998e81ac037b6438863bb7a", + "mixed-quotes": "1d670a5575e2f01ddf6c583ee0afb1e54e6f39743f4e6592a2dce43a4c04dc44", + "quickjs-int-arith": "483eb8091ff83632c1c58c91554a07dc180d95e5b9374b67002f83cc10632d2e", + "quickjs-bitops": "382fab47164d9a4e6bc2080140b41b40a797d967ef605345b07a22daad08e5c7", + "quickjs-fibonacci": "96ad95758210c1f9b99c5046a2e062a60d1415dceb58fdbf6173a1a28a1381e1", + "numeric": "71fccfc372ce1abc5229e79e390dec06a17b42f6a9f9f7a6747222f2df525f50", + "scalar-loop": "db9037d16bf51a21a033ddc5901eac1a70a80c51628a5a5a937327faf0ed8a45", + "call-heavy": "a6cc40c5fb963f376a4fd35469a59a23b37420c564756319bc6d9c19b35f8fb0", + "generic-call-entry": "1eb475e3de0557bda01a5166e4d782d826f227370c6d4f72e1cb92e330a2cc40", + "generic-call-fallback": "af1c8b8d3eb97968c1924927bdb5744c1678a2c9d82dec6f8b3f772451f12596", + "property-heavy": "10bf81e6d712b8980df2a404be0d0456de92df5afc22ae30e5c086a33dea30cb", + "fibonacci-iterative": "7f7c397e968bd4d88a70cd4eaad43e861f456f996bd93a2eecb3d583d31b39f4", + "fibonacci-recursive": "19af48c9602fd18c911d1d19daf48a3608209712f1205e7959680a0bf5fde3a0", + "collections": "5a28d974119bfa1c1200d4e28daef3c228bb7792e0055ed9f0b164c9a74712c6", + "for-of-array": "2b96c8573916dfb0f0bc02402afefc00ca63e581df42b69fbf43a1bb51055ecc", + "strings-json": "c4ddcd0f2b34ab1b76e5a6f9b09cc0b590a14097a8457f35d1c9c1de4295231e", + "calls-closures": "2b72055e0638c572fa69f75622c9308c1e7e220a0bf1b1a772e21e6af68b5b15", + "adversarial": "aba1b49b0439f72eacefdaeff63793256c9e9765b7deb202bc25191c4b5b5095", + "float64-dense": "35220498f859305ab3444f165af3e004136cc69c71bfb19683bbdce24db0163b", + "strings-regexp": "709bb01131e108922bf9843d561c74c2097e58ba2fe42988c079bc3683e50889", + "arrays-typed": "a19284a8c4e7613bfdee18131871f5865f62f05e893d188511209426a5b7687b", + "packed-array-traversal": "03ef60d655ca39319b88b22e3f5010cd6de55be0c755d97eeb2cc797b84cdb7c", + "int32array-traversal": "6fb7aa242ecd2edb3b000037521d8ff8880508f6ba532ad8ffb6441364f24750", + "float64array-traversal": "b558b5337e9bae384df4b8c9e7beabe7c584b446c093ee45cacee9e3216e61ba", + "typed-convert-traversal": "957a26e561c80d9cf153c9f9ac4b777e2f550cadcb360fb6aea839641bd9b990", + "objects-polymorphic": "0b43980bee67f25de8a453d191e113cd427f57b730b7f136435ca6ab4f9bbd69", + "property-polymorphic": "6f872085fbdc743ed1e81827fe39db71d33aec8b25bc7d1cee09fcf64f9758ea", + "calls-recursion-closures": "e2c2f192b5915b77c20f852feb6e21b15dbf879507ee851f4da514f9c9300757", + "json-codec": "36526695061ee1fa90c7bfee357064af6d28c11af1a00145bf28fe1712e268e3", + "map-set-bigint": "2ec0a33414b8c230cfd5028cf1a5aa769b3033da4f797fbb421ea63e1e66b954", + "exceptions-promises-async": "78236c5910b41a1e4d57aea88a78fd3941236b999793d605de8976a9cc6f99a1", + "methods-dynamic": "f358b173509f6aaa9f4f74b7d39b1e23391af24222829507e7da8a6347a4734d", + "exceptions-sync": "35f49e7fd970a16627cc2933673c53a20e4530ac5a151d03cdc1d5687045f9dd" + }, + "command": [ + "benchmarks/paired.py", + "--binaries", + "target/bench-evidence/fix-8fa2a48/bins.json", + "--scripts", + "benchmarks/scripts", + "--workloads", + "scalar-control-flow,scalar-expressions,host-compute,mixed-quotes,quickjs-int-arith,quickjs-bitops,quickjs-fibonacci,numeric,scalar-loop,call-heavy,generic-call-entry,generic-call-fallback,property-heavy,fibonacci-iterative,fibonacci-recursive,collections,for-of-array,strings-json,calls-closures,adversarial,float64-dense,strings-regexp,arrays-typed,packed-array-traversal,int32array-traversal,float64array-traversal,typed-convert-traversal,objects-polymorphic,property-polymorphic,calls-recursion-closures,json-codec,map-set-bigint,exceptions-promises-async,methods-dynamic,exceptions-sync", + "--output", + "target/bench-evidence/fix-8fa2a48/paired", + "--cpu", + "8", + "--pairs", + "30" + ], + "collector_sha256": "20ff6c4cdab95a5c8ea39128bd2854fac9e8947d7baf1bbe13ef6722fa54fa03", + "cpu_description": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 39 bits physical, 48 bits virtual\nByte Order: Little Endian\nCPU(s): 24\nOn-line CPU(s) list: 0-23\nVendor ID: GenuineIntel\nModel name: 13th Gen Intel(R) Core(TM) i7-13700KF\nCPU family: 6\nModel: 183\nThread(s) per core: 2\nCore(s) per socket: 16\nSocket(s): 1\nStepping: 1\nMicrocode version: 0x137\nCPU(s) scaling MHz: 84%\nCPU max MHz: 5400.0000\nCPU min MHz: 800.0000\nBogoMIPS: 6835.20\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves split_lock_detect user_shstk avx_vnni dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req hfi vnmi umip pku ospke waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize arch_lbr ibt flush_l1d arch_capabilities\nVirtualization: VT-x\nL1d cache: 640 KiB (16 instances)\nL1i cache: 768 KiB (16 instances)\nL2 cache: 24 MiB (10 instances)\nL3 cache: 30 MiB (1 instance)\nNUMA node(s): 1\nNUMA node0 CPU(s): 0-23\nVulnerability Gather data sampling: Not affected\nVulnerability Ghostwrite: Not affected\nVulnerability Indirect target selection: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Old microcode: Not affected\nVulnerability Reg file data sampling: Mitigation; Clear Register File\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Not affected\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced / Automatic IBRS; IBPB conditional; PBRSB-eIBRS SW sequence; BHI BHI_DIS_S\nVulnerability Srbds: Not affected\nVulnerability Tsa: Not affected\nVulnerability Tsx async abort: Not affected\nVulnerability Vmscape: Mitigation; IBPB before exit to userspace", + "governor": "powersave", + "platform": "Linux-7.2.5-3-omarchy-x86_64-with-glibc2.44", + "bun_path": "/home/jason/.bun/bin/bun", + "bun_version": "1.4.0", + "bun_sha256": "33d56b070be6a9e3da0ab013038b43d1645d0534ca811ecdba4472599117eb4b", + "bun_flags": [], + "rustc": "rustc 1.98.1 (48a229cea 2026-09-01)\nbinary: rustc\ncommit-hash: 48a229ceaefd4985c50990b14116b6d856af0985\ncommit-date: 2026-09-01\nhost: x86_64-unknown-linux-gnu\nrelease: 1.98.1\nLLVM version: 22.1.8\n", + "protocol": "shared-js-multibatch-v3", + "timed_batches": 16, + "throughput_windows": 0, + "note": "Latency-only paired candidate diagnostic. elapsed_ns is the median of the timed 10-call batches that follow 64 warmups; the first timed batch is the legacy fixed-batch diagnostic. Counters include shared driver. Readiness diagnostic is separately conditioned." +} diff --git a/benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.json b/benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.json new file mode 100644 index 00000000..b86c4d1e --- /dev/null +++ b/benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.json @@ -0,0 +1,7562 @@ +[ + { + "workload": "scalar-control-flow", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 43693.5, + "fixed_batch_median_ns": 43615.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 48.81782237668742, + "ci95": [ + 48.75356007052558, + 48.88016102914478 + ] + }, + "previous/bun": { + "speed": 0.5219137611275692, + "ci95": [ + 0.48660747068417, + 0.5445454991221511 + ] + }, + "candidate/interpreter": { + "speed": 48.85554585579261, + "ci95": [ + 48.80761624247371, + 48.90408158826622 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "scalar-control-flow", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 43405.5, + "fixed_batch_median_ns": 43425.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.006032263217604, + "ci95": [ + 1.004021708552776, + 1.0080030412621617 + ] + }, + "previous/interpreter": { + "speed": 49.11230433097383, + "ci95": [ + 49.021891145706384, + 49.192711141175785 + ] + }, + "previous/bun": { + "speed": 0.5250620823115805, + "ci95": [ + 0.48955529148311105, + 0.547685389361238 + ] + }, + "candidate/interpreter": { + "speed": 49.15025536803448, + "ci95": [ + 49.064125327580015, + 49.24338297557344 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "scalar-control-flow", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2131951.0, + "fixed_batch_median_ns": 2128994.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02048432214537989, + "ci95": [ + 0.02045753992369192, + 0.020510964122011126 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.010691049615043979, + "ci95": [ + 0.009965103518073197, + 0.011153985747390559 + ] + }, + "candidate/interpreter": { + "speed": 1.0007727398984352, + "ci95": [ + 0.9998391218660881, + 1.0017949634834766 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-control-flow", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 23753.0, + "fixed_batch_median_ns": 23813.0, + "outlier_batches": 14, + "outlier_processes": 14, + "comparisons": { + "previous/automatic": { + "speed": 1.9160253560656244, + "ci95": [ + 1.8362559386224933, + 2.0560550819337178 + ] + }, + "previous/interpreter": { + "speed": 93.53618550164089, + "ci95": [ + 89.66129113041023, + 100.31857665283543 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 93.60846464412546, + "ci95": [ + 89.72679544707553, + 100.39991704432343 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-control-flow", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2134022.0, + "fixed_batch_median_ns": 2132016.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.020468505314661916, + "ci95": [ + 0.020447840920382345, + 0.02048840300129253 + ] + }, + "previous/interpreter": { + "speed": 0.9992278567674479, + "ci95": [ + 0.998240171709309, + 1.0001494383438596 + ] + }, + "previous/bun": { + "speed": 0.010682794593434842, + "ci95": [ + 0.00995939498434884, + 0.011146003506706253 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-expressions", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 45233.0, + "fixed_batch_median_ns": 45155.0, + "outlier_batches": 10, + "outlier_processes": 10, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 47.67788028616548, + "ci95": [ + 47.636619940827686, + 47.71823932939368 + ] + }, + "previous/bun": { + "speed": 0.4284893937084732, + "ci95": [ + 0.4016908110377621, + 0.44654845480959726 + ] + }, + "candidate/interpreter": { + "speed": 47.69562980940178, + "ci95": [ + 47.65027415895855, + 47.74006023611209 + ] + } + }, + "compilation_quiet_samples": 10, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "scalar-expressions", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 45561.5, + "fixed_batch_median_ns": 45533.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9937265822729556, + "ci95": [ + 0.9927655897789823, + 0.9947108782334317 + ] + }, + "previous/interpreter": { + "speed": 47.378777026790345, + "ci95": [ + 47.33617624568355, + 47.42775474328642 + ] + }, + "previous/bun": { + "speed": 0.42580130075013195, + "ci95": [ + 0.39902793566659017, + 0.4438335840226901 + ] + }, + "candidate/interpreter": { + "speed": 47.396415199852946, + "ci95": [ + 47.35174912017744, + 47.44744289052663 + ] + } + }, + "compilation_quiet_samples": 29, + "native_entry_range": [ + 10, + 20 + ] + }, + { + "workload": "scalar-expressions", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2158619.5, + "fixed_batch_median_ns": 2158421.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.020974086809185735, + "ci95": [ + 0.020956301461249566, + 0.020992038713258023 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.008987173740456883, + "ci95": [ + 0.008409809275774794, + 0.009363431077703065 + ] + }, + "candidate/interpreter": { + "speed": 1.00037228004118, + "ci95": [ + 1.0001283477965692, + 1.0006141789340797 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-expressions", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 20081.0, + "fixed_batch_median_ns": 20426.0, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 2.333780053095922, + "ci95": [ + 2.2395090160027005, + 2.4895432117954135 + ] + }, + "previous/interpreter": { + "speed": 111.26968598574825, + "ci95": [ + 106.78976855496276, + 118.68886769340071 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 111.31110946902915, + "ci95": [ + 106.80376624921544, + 118.81678426536486 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-expressions", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2159214.0, + "fixed_batch_median_ns": 2159278.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.020966281481052573, + "ci95": [ + 0.020947507294914205, + 0.020985936423775796 + ] + }, + "previous/interpreter": { + "speed": 0.9996278584996731, + "ci95": [ + 0.9993893337208324, + 0.9998711537842717 + ] + }, + "previous/bun": { + "speed": 0.008983829240137409, + "ci95": [ + 0.008422749414306336, + 0.009364278859221151 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "host-compute", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 51438.5, + "fixed_batch_median_ns": 51576.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 40.76292697863416, + "ci95": [ + 39.69353634545215, + 41.719260914634326 + ] + }, + "previous/bun": { + "speed": 0.5327552488945008, + "ci95": [ + 0.514900728612644, + 0.5492445897967377 + ] + }, + "candidate/interpreter": { + "speed": 40.69573300646627, + "ci95": [ + 39.66697491798138, + 41.63402229389452 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "host-compute", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 51168.5, + "fixed_batch_median_ns": 51109.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0387766984767737, + "ci95": [ + 1.0133575097149625, + 1.0666286876092113 + ] + }, + "previous/interpreter": { + "speed": 42.34357870711539, + "ci95": [ + 42.203915607305156, + 42.487580693033316 + ] + }, + "previous/bun": { + "speed": 0.5534137385428014, + "ci95": [ + 0.5421578854527108, + 0.5646577016985794 + ] + }, + "candidate/interpreter": { + "speed": 42.27377917454929, + "ci95": [ + 42.018475248266334, + 42.47073714529604 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "host-compute", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2163457.0, + "fixed_batch_median_ns": 2165898.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02453209507070355, + "ci95": [ + 0.023965202207216818, + 0.025184831347947453 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.013069602415296233, + "ci95": [ + 0.012802110373806836, + 0.013327254038470758 + ] + }, + "candidate/interpreter": { + "speed": 0.9983515910865991, + "ci95": [ + 0.993966746964515, + 1.0011202342339425 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "host-compute", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 28683.0, + "fixed_batch_median_ns": 30182.0, + "outlier_batches": 20, + "outlier_processes": 20, + "comparisons": { + "previous/automatic": { + "speed": 1.877034533352905, + "ci95": [ + 1.8191569241381684, + 1.9409272302506453 + ] + }, + "previous/interpreter": { + "speed": 76.51342161943907, + "ci95": [ + 75.02211743055727, + 78.08533014166714 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 76.38729621324678, + "ci95": [ + 74.87755803056099, + 77.98690177856695 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "host-compute", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2164371.5, + "fixed_batch_median_ns": 2162172.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02457260076482974, + "ci95": [ + 0.024015887528161344, + 0.02521387783798534 + ] + }, + "previous/interpreter": { + "speed": 1.0016511306518847, + "ci95": [ + 0.9988930565933458, + 1.0062388476248518 + ] + }, + "previous/bun": { + "speed": 0.013091182036452076, + "ci95": [ + 0.012818662753834432, + 0.013352406695107757 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "mixed-quotes", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 642531.0, + "fixed_batch_median_ns": 643959.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 4.305791650791487, + "ci95": [ + 4.2940908008848755, + 4.320893996255184 + ] + }, + "previous/bun": { + "speed": 0.0920395842252749, + "ci95": [ + 0.09154198966684628, + 0.09256391008325073 + ] + }, + "candidate/interpreter": { + "speed": 4.30835572328371, + "ci95": [ + 4.301351991082307, + 4.315110349952814 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 6990, + 6990 + ] + }, + { + "workload": "mixed-quotes", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 648014.0, + "fixed_batch_median_ns": 648590.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9917902311607174, + "ci95": [ + 0.9897387501767713, + 0.9937916935081199 + ] + }, + "previous/interpreter": { + "speed": 4.270442096668376, + "ci95": [ + 4.261452285456611, + 4.281392678665105 + ] + }, + "previous/bun": { + "speed": 0.09128396051472172, + "ci95": [ + 0.0907902548635223, + 0.0918160663331101 + ] + }, + "candidate/interpreter": { + "speed": 4.272985118718151, + "ci95": [ + 4.265962497454264, + 4.279867332912396 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 6990, + 6990 + ] + }, + { + "workload": "mixed-quotes", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2761386.0, + "fixed_batch_median_ns": 2762719.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.23224532933826028, + "ci95": [ + 0.23143479065295106, + 0.23288800898659115 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.02137576355055552, + "ci95": [ + 0.021267492088429516, + 0.021492259677090866 + ] + }, + "candidate/interpreter": { + "speed": 1.0005954938604036, + "ci95": [ + 0.9976494965649784, + 1.0026781395967443 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "mixed-quotes", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 58754.0, + "fixed_batch_median_ns": 57677.0, + "outlier_batches": 4, + "outlier_processes": 4, + "comparisons": { + "previous/automatic": { + "speed": 10.864890453572812, + "ci95": [ + 10.804734712593767, + 10.923521343319505 + ] + }, + "previous/interpreter": { + "speed": 46.781954601757924, + "ci95": [ + 46.527486784441145, + 47.01371375299481 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 46.809812968500964, + "ci95": [ + 46.55561450199434, + 47.06104004883096 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "mixed-quotes", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2767317.5, + "fixed_batch_median_ns": 2773357.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.23210711097871642, + "ci95": [ + 0.2317419768139522, + 0.23248081206912866 + ] + }, + "previous/interpreter": { + "speed": 0.99940486054149, + "ci95": [ + 0.9973194845900873, + 1.0024376069838834 + ] + }, + "previous/bun": { + "speed": 0.021363041990210798, + "ci95": [ + 0.021247897958422465, + 0.021482300733032884 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-int-arith", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 318887.5, + "fixed_batch_median_ns": 319000.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 18.250471269233483, + "ci95": [ + 18.203692199498406, + 18.300314116551696 + ] + }, + "previous/bun": { + "speed": 0.15176001294875774, + "ci95": [ + 0.1505217764068895, + 0.15323681127986774 + ] + }, + "candidate/interpreter": { + "speed": 18.322005729809803, + "ci95": [ + 18.192836414236396, + 18.54186479003029 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "quickjs-int-arith", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 319154.0, + "fixed_batch_median_ns": 318804.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.998938806083538, + "ci95": [ + 0.996261958909962, + 1.0015916233930007 + ] + }, + "previous/interpreter": { + "speed": 18.231103980150007, + "ci95": [ + 18.180607672261694, + 18.283657709357513 + ] + }, + "previous/bun": { + "speed": 0.15159896614625434, + "ci95": [ + 0.15029859941238893, + 0.15312993852637136 + ] + }, + "candidate/interpreter": { + "speed": 18.30256252879195, + "ci95": [ + 18.1697762525616, + 18.524091130822264 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "quickjs-int-arith", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 5811095.5, + "fixed_batch_median_ns": 5818015.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.05479310562712937, + "ci95": [ + 0.054645861155418765, + 0.054939106301782926 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.008315402419475808, + "ci95": [ + 0.00824898828560657, + 0.008394151128860675 + ] + }, + "candidate/interpreter": { + "speed": 1.003919595254338, + "ci95": [ + 0.9977889808600534, + 1.0150335784387945 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-int-arith", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 47744.0, + "fixed_batch_median_ns": 48164.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 6.589351045572546, + "ci95": [ + 6.525568346511724, + 6.643562634744291 + ] + }, + "previous/interpreter": { + "speed": 120.25876194011529, + "ci95": [ + 119.10777152850274, + 121.20836930234492 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 120.73012761270842, + "ci95": [ + 119.20305059062495, + 122.63291439541239 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-int-arith", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 5801479.0, + "fixed_batch_median_ns": 5807965.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.05457917734263151, + "ci95": [ + 0.05392790926980032, + 0.054965918427939846 + ] + }, + "previous/interpreter": { + "speed": 0.9960957079900955, + "ci95": [ + 0.9850937451011849, + 1.0021976336881053 + ] + }, + "previous/bun": { + "speed": 0.008282936660250304, + "ci95": [ + 0.008155938969694914, + 0.008387413119701813 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-bitops", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 27871.5, + "fixed_batch_median_ns": 27721.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 42.69660916982731, + "ci95": [ + 42.41100750627328, + 42.87567242531148 + ] + }, + "previous/bun": { + "speed": 0.5813579797840126, + "ci95": [ + 0.5676695022770059, + 0.5977513455686468 + ] + }, + "candidate/interpreter": { + "speed": 42.73937942074675, + "ci95": [ + 42.449467869153175, + 42.91476237588636 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "quickjs-bitops", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 28055.0, + "fixed_batch_median_ns": 28026.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9963607794135123, + "ci95": [ + 0.9926604460924825, + 1.0021104946095891 + ] + }, + "previous/interpreter": { + "speed": 42.54122679076326, + "ci95": [ + 42.456090181408996, + 42.6268123738199 + ] + }, + "previous/bun": { + "speed": 0.5792422898558637, + "ci95": [ + 0.5662064917546374, + 0.5953644364347579 + ] + }, + "candidate/interpreter": { + "speed": 42.58384139130506, + "ci95": [ + 42.50088377589127, + 42.65917632874986 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "quickjs-bitops", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1192808.5, + "fixed_batch_median_ns": 1191604.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.023421063626445453, + "ci95": [ + 0.023323002261143064, + 0.023583284080339207 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.013616022234263146, + "ci95": [ + 0.013307905521876811, + 0.01399566685385997 + ] + }, + "candidate/interpreter": { + "speed": 1.0010017247681031, + "ci95": [ + 0.9998694195038808, + 1.0020499293419527 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-bitops", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 15948.5, + "fixed_batch_median_ns": 15948.5, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 1.7201105597131776, + "ci95": [ + 1.6742516201271676, + 1.7622276559948225 + ] + }, + "previous/interpreter": { + "speed": 73.44288829696647, + "ci95": [ + 71.46961928991466, + 75.17490180819554 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 73.51645785721458, + "ci95": [ + 71.56316564483743, + 75.23328360578283 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-bitops", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1194277.5, + "fixed_batch_median_ns": 1193434.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.023397625645321732, + "ci95": [ + 0.023301953890320155, + 0.023556372250643304 + ] + }, + "previous/interpreter": { + "speed": 0.9989992776802307, + "ci95": [ + 0.9979594895191035, + 1.0000718613231923 + ] + }, + "previous/bun": { + "speed": 0.013602396376906842, + "ci95": [ + 0.013300098330582818, + 0.013971907559116026 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-fibonacci", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 372799.0, + "fixed_batch_median_ns": 378411.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 2.55366705606247, + "ci95": [ + 2.517465776070522, + 2.61133373116452 + ] + }, + "previous/bun": { + "speed": 0.03538779262963584, + "ci95": [ + 0.03480745939635956, + 0.03622339370153894 + ] + }, + "candidate/interpreter": { + "speed": 2.5281289105930336, + "ci95": [ + 2.516607768075782, + 2.538882098562635 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "quickjs-fibonacci", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 376973.5, + "fixed_batch_median_ns": 376676.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9945165510719349, + "ci95": [ + 0.9890246507224079, + 0.9999422208120518 + ] + }, + "previous/interpreter": { + "speed": 2.539664153181269, + "ci95": [ + 2.504071228205538, + 2.5971635113740335 + ] + }, + "previous/bun": { + "speed": 0.03519374547607426, + "ci95": [ + 0.03460405113080839, + 0.036033742523878844 + ] + }, + "candidate/interpreter": { + "speed": 2.514266044828232, + "ci95": [ + 2.5025461557190067, + 2.5261264951038864 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "quickjs-fibonacci", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 946940.0, + "fixed_batch_median_ns": 947011.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.391593726999757, + "ci95": [ + 0.38288278809312504, + 0.3971566201268731 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.013857637606133627, + "ci95": [ + 0.013473407550794316, + 0.01425364481651947 + ] + }, + "candidate/interpreter": { + "speed": 0.9899994224349614, + "ci95": [ + 0.9700665430529388, + 1.0019813992890894 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-fibonacci", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 13169.5, + "fixed_batch_median_ns": 13131.5, + "outlier_batches": 2, + "outlier_processes": 2, + "comparisons": { + "previous/automatic": { + "speed": 28.25833220132924, + "ci95": [ + 27.618236565198217, + 28.736503203833944 + ] + }, + "previous/interpreter": { + "speed": 72.16237200180376, + "ci95": [ + 70.18632325146913, + 74.22717162522322 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 71.44070660332257, + "ci95": [ + 69.80312272703651, + 72.64776140433027 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "quickjs-fibonacci", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 947265.0, + "fixed_batch_median_ns": 947053.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.3955494499548387, + "ci95": [ + 0.39385974381317346, + 0.39731824917864583 + ] + }, + "previous/interpreter": { + "speed": 1.0101015993933022, + "ci95": [ + 0.9980519085054526, + 1.0312467890329384 + ] + }, + "previous/bun": { + "speed": 0.013997621909768346, + "ci95": [ + 0.013762059385553867, + 0.014322833675713983 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "numeric", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 21032.0, + "fixed_batch_median_ns": 20937.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 25.673085674929993, + "ci95": [ + 25.594903238454346, + 25.76773250449629 + ] + }, + "previous/bun": { + "speed": 0.539991046331353, + "ci95": [ + 0.5016530724364965, + 0.5670491375781032 + ] + }, + "candidate/interpreter": { + "speed": 25.670037412359267, + "ci95": [ + 25.620135703874812, + 25.7209931341605 + ] + } + }, + "compilation_quiet_samples": 26, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "numeric", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 21097.0, + "fixed_batch_median_ns": 17890.0, + "outlier_batches": 10, + "outlier_processes": 10, + "comparisons": { + "previous/automatic": { + "speed": 1.0363785142719923, + "ci95": [ + 1.0120032731573834, + 1.065323758396841 + ] + }, + "previous/interpreter": { + "speed": 26.607034388561516, + "ci95": [ + 25.971524635894724, + 27.354648761337636 + ] + }, + "previous/bun": { + "speed": 0.5596351183170662, + "ci95": [ + 0.5213624094957574, + 0.589146804936258 + ] + }, + "candidate/interpreter": { + "speed": 26.60387523472737, + "ci95": [ + 25.967282358159306, + 27.37536912334232 + ] + } + }, + "compilation_quiet_samples": 9, + "native_entry_range": [ + 10, + 20 + ] + }, + { + "workload": "numeric", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 538958.0, + "fixed_batch_median_ns": 536888.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.038951297583075854, + "ci95": [ + 0.038808069600047415, + 0.03907053316027317 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.02103335193784904, + "ci95": [ + 0.019519094083020248, + 0.022095691127646706 + ] + }, + "candidate/interpreter": { + "speed": 0.9998812662174967, + "ci95": [ + 0.9965581806865452, + 1.0030075982537754 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "numeric", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 11477.0, + "fixed_batch_median_ns": 12231.0, + "outlier_batches": 6, + "outlier_processes": 6, + "comparisons": { + "previous/automatic": { + "speed": 1.8518825576718418, + "ci95": [ + 1.7620322419745231, + 1.998015197744536 + ] + }, + "previous/interpreter": { + "speed": 47.54353956301766, + "ci95": [ + 45.2708926424214, + 51.203969457333486 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 47.537894538731756, + "ci95": [ + 45.26776571826462, + 51.23278060812778 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "numeric", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 539264.0, + "fixed_batch_median_ns": 539063.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03895592296716067, + "ci95": [ + 0.03887936195453697, + 0.039033084850270544 + ] + }, + "previous/interpreter": { + "speed": 1.0001187478818885, + "ci95": [ + 0.9970456551718374, + 1.0034657556945947 + ] + }, + "previous/bun": { + "speed": 0.02103584960384067, + "ci95": [ + 0.019550715883417207, + 0.02208876776988818 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-loop", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 21009.5, + "fixed_batch_median_ns": 20979.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 25.651429765798884, + "ci95": [ + 25.609191985524653, + 25.69952809378246 + ] + }, + "previous/bun": { + "speed": 0.5462098790452549, + "ci95": [ + 0.5391713187079575, + 0.5544792271231586 + ] + }, + "candidate/interpreter": { + "speed": 25.695950431368153, + "ci95": [ + 25.65238737935667, + 25.745548615779846 + ] + } + }, + "compilation_quiet_samples": 28, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "scalar-loop", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 21112.5, + "fixed_batch_median_ns": 18033.0, + "outlier_batches": 9, + "outlier_processes": 9, + "comparisons": { + "previous/automatic": { + "speed": 1.0322193166093254, + "ci95": [ + 1.0048466637563245, + 1.0628614405712442 + ] + }, + "previous/interpreter": { + "speed": 26.477901302905032, + "ci95": [ + 25.791897375365952, + 27.263487321025636 + ] + }, + "previous/bun": { + "speed": 0.5638083880733553, + "ci95": [ + 0.54713615616, + 0.5823287667771188 + ] + }, + "candidate/interpreter": { + "speed": 26.523856393893922, + "ci95": [ + 25.828322359996893, + 27.31694081983826 + ] + } + }, + "compilation_quiet_samples": 13, + "native_entry_range": [ + 10, + 20 + ] + }, + { + "workload": "scalar-loop", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 538785.0, + "fixed_batch_median_ns": 536869.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03898418174464887, + "ci95": [ + 0.03891125681248569, + 0.03904684267600425 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.0212935451954229, + "ci95": [ + 0.021015101876479224, + 0.021627244439956922 + ] + }, + "candidate/interpreter": { + "speed": 1.0017356017179446, + "ci95": [ + 0.9998400138390516, + 1.003528252962715 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-loop", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 11371.5, + "fixed_batch_median_ns": 11569.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.830798083967184, + "ci95": [ + 1.8032455889680403, + 1.854764889228964 + ] + }, + "previous/interpreter": { + "speed": 46.962588466243396, + "ci95": [ + 46.24408813422243, + 47.56667660443265 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 47.044096815464556, + "ci95": [ + 46.313900418570924, + 47.67281945620949 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "scalar-loop", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 539100.0, + "fixed_batch_median_ns": 538238.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03891663796094722, + "ci95": [ + 0.038841522219612803, + 0.03898210198205378 + ] + }, + "previous/interpreter": { + "speed": 0.9982674053762608, + "ci95": [ + 0.9964687894498577, + 1.0001116617729637 + ] + }, + "previous/bun": { + "speed": 0.021256652113496956, + "ci95": [ + 0.020980842165103646, + 0.021595076666506497 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "call-heavy", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 39074.5, + "fixed_batch_median_ns": 39330.0, + "outlier_batches": 3, + "outlier_processes": 3, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 33.003479070207064, + "ci95": [ + 32.89756530159454, + 33.157199168927754 + ] + }, + "previous/bun": { + "speed": 0.5060216383020388, + "ci95": [ + 0.4642819774996169, + 0.5309031288707943 + ] + }, + "candidate/interpreter": { + "speed": 32.99374757698405, + "ci95": [ + 32.9003895279988, + 33.11921851970844 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "call-heavy", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 38849.5, + "fixed_batch_median_ns": 39168.5, + "outlier_batches": 3, + "outlier_processes": 3, + "comparisons": { + "previous/automatic": { + "speed": 1.0032315880413096, + "ci95": [ + 0.9997143206350216, + 1.0058957347835116 + ] + }, + "previous/interpreter": { + "speed": 33.110132718491954, + "ci95": [ + 32.96395014399653, + 33.282787462422114 + ] + }, + "previous/bun": { + "speed": 0.5076568917770197, + "ci95": [ + 0.46521817844812413, + 0.5333350635921121 + ] + }, + "candidate/interpreter": { + "speed": 33.10036977709182, + "ci95": [ + 32.97055301428004, + 33.2244453371513 + ] + } + }, + "compilation_quiet_samples": 27, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "call-heavy", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1286376.0, + "fixed_batch_median_ns": 1287345.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.030299835901322326, + "ci95": [ + 0.0301624130215042, + 0.030397604521649135 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.015332372603070053, + "ci95": [ + 0.014083162369503178, + 0.01609057644454513 + ] + }, + "candidate/interpreter": { + "speed": 0.999705137352268, + "ci95": [ + 0.9946736511107329, + 1.0039588160603174 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "call-heavy", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 20711.5, + "fixed_batch_median_ns": 20596.5, + "outlier_batches": 15, + "outlier_processes": 15, + "comparisons": { + "previous/automatic": { + "speed": 1.9762000758614018, + "ci95": [ + 1.8840642738332836, + 2.1476081287131987 + ] + }, + "previous/interpreter": { + "speed": 65.22147784223341, + "ci95": [ + 62.16189119441543, + 70.83909115650876 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 65.20224646458782, + "ci95": [ + 62.16737271736238, + 70.86431211657857 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "call-heavy", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1286109.0, + "fixed_batch_median_ns": 1286542.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.030308772826327407, + "ci95": [ + 0.030194615624683133, + 0.030395891993114366 + ] + }, + "previous/interpreter": { + "speed": 1.0002949496173572, + "ci95": [ + 0.9959997775569234, + 1.0053381574958866 + ] + }, + "previous/bun": { + "speed": 0.015336894880502513, + "ci95": [ + 0.014107866181632532, + 0.016087392706307033 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "generic-call-entry", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 26012.5, + "fixed_batch_median_ns": 25942.5, + "outlier_batches": 6, + "outlier_processes": 6, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 36.975470360469494, + "ci95": [ + 36.51816660626678, + 37.338151706209146 + ] + }, + "previous/bun": { + "speed": 0.6392518146599405, + "ci95": [ + 0.5814593183311704, + 0.6797739645666454 + ] + }, + "candidate/interpreter": { + "speed": 36.982493608484205, + "ci95": [ + 36.523254857509, + 37.353845033839924 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "generic-call-entry", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 26038.5, + "fixed_batch_median_ns": 26106.5, + "outlier_batches": 3, + "outlier_processes": 3, + "comparisons": { + "previous/automatic": { + "speed": 0.983628390785271, + "ci95": [ + 0.9645824596531447, + 1.0027050248227234 + ] + }, + "previous/interpreter": { + "speed": 36.3701224091971, + "ci95": [ + 35.79622818231153, + 36.91937881945175 + ] + }, + "previous/bun": { + "speed": 0.6287862337605217, + "ci95": [ + 0.5689285585286431, + 0.6722212555617164 + ] + }, + "candidate/interpreter": { + "speed": 36.377030675339896, + "ci95": [ + 35.785687175384474, + 36.955581566223216 + ] + } + }, + "compilation_quiet_samples": 17, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "generic-call-entry", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 972203.5, + "fixed_batch_median_ns": 972073.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.0270449568389832, + "ci95": [ + 0.02678327590107489, + 0.027378975871672793 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.01728853773671978, + "ci95": [ + 0.015753544467765355, + 0.018367909461787936 + ] + }, + "candidate/interpreter": { + "speed": 1.0001899434394272, + "ci95": [ + 0.9986672681959062, + 1.0018042319958902 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "generic-call-entry", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 16971.0, + "fixed_batch_median_ns": 17008.0, + "outlier_batches": 7, + "outlier_processes": 7, + "comparisons": { + "previous/automatic": { + "speed": 1.5643287622608701, + "ci95": [ + 1.471259159900947, + 1.724297960444924 + ] + }, + "previous/interpreter": { + "speed": 57.84179178300674, + "ci95": [ + 54.44906826559433, + 63.55508955578536 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 57.85277845188067, + "ci95": [ + 54.418316090081355, + 63.65486929350656 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "generic-call-entry", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 972498.5, + "fixed_batch_median_ns": 972442.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02703982080241849, + "ci95": [ + 0.026769309661302337, + 0.027378905250927718 + ] + }, + "previous/interpreter": { + "speed": 0.9998100926322313, + "ci95": [ + 0.9981955561450221, + 1.0012947569090405 + ] + }, + "previous/bun": { + "speed": 0.01728525451602562, + "ci95": [ + 0.015710581521016866, + 0.01836748165015883 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "generic-call-fallback", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 205681.0, + "fixed_batch_median_ns": 207481.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 6.274292267448341, + "ci95": [ + 6.2547409834588805, + 6.292572008561515 + ] + }, + "previous/bun": { + "speed": 0.09814964437523117, + "ci95": [ + 0.08817385779822304, + 0.10663308583570624 + ] + }, + "candidate/interpreter": { + "speed": 6.2604646151412195, + "ci95": [ + 6.242990267350404, + 6.277546234628222 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "generic-call-fallback", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 205159.0, + "fixed_batch_median_ns": 205382.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0039627692897464, + "ci95": [ + 1.0011897277970883, + 1.00710000912685 + ] + }, + "previous/interpreter": { + "speed": 6.299155840160679, + "ci95": [ + 6.2825128418838405, + 6.315010615603131 + ] + }, + "previous/bun": { + "speed": 0.09853858877176087, + "ci95": [ + 0.08835317388080492, + 0.10721976972634295 + ] + }, + "candidate/interpreter": { + "speed": 6.285273392057644, + "ci95": [ + 6.270475493845059, + 6.29912114789767 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "generic-call-fallback", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1292639.5, + "fixed_batch_median_ns": 1292636.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.1593805257029706, + "ci95": [ + 0.1589153240108551, + 0.15988169256227275 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.01564314191808396, + "ci95": [ + 0.01407115639503347, + 0.017011241356230562 + ] + }, + "candidate/interpreter": { + "speed": 0.997796141506053, + "ci95": [ + 0.9957398753258841, + 0.9998781768906387 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "generic-call-fallback", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 19923.5, + "fixed_batch_median_ns": 24677.5, + "outlier_batches": 19, + "outlier_processes": 19, + "comparisons": { + "previous/automatic": { + "speed": 10.188523925537092, + "ci95": [ + 9.377191181933508, + 11.318662037030759 + ] + }, + "previous/interpreter": { + "speed": 63.92577688270978, + "ci95": [ + 58.77386915588923, + 71.11281741217891 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 63.7848935163447, + "ci95": [ + 58.763204747904524, + 71.02903994652446 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "generic-call-fallback", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1289893.5, + "fixed_batch_median_ns": 1291999.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.15973255364808775, + "ci95": [ + 0.15930511215150014, + 0.16018265174439103 + ] + }, + "previous/interpreter": { + "speed": 1.0022087262139745, + "ci95": [ + 1.000194883433273, + 1.0042927657577094 + ] + }, + "previous/bun": { + "speed": 0.01567769333570736, + "ci95": [ + 0.014112759907929725, + 0.017005863634719825 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "property-heavy", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 28185.5, + "fixed_batch_median_ns": 28230.0, + "outlier_batches": 10, + "outlier_processes": 10, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 37.659142553729446, + "ci95": [ + 37.36010202582251, + 37.87611971215188 + ] + }, + "previous/bun": { + "speed": 0.439374982817178, + "ci95": [ + 0.36656032666629307, + 0.5340659016793957 + ] + }, + "candidate/interpreter": { + "speed": 37.67213135989866, + "ci95": [ + 37.38499882363888, + 37.89210236292918 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "property-heavy", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 28061.0, + "fixed_batch_median_ns": 28087.0, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 1.0038145083593755, + "ci95": [ + 0.9931123506490566, + 1.014262026161368 + ] + }, + "previous/interpreter": { + "speed": 37.80279366780755, + "ci95": [ + 37.47424958490135, + 38.033425843284185 + ] + }, + "previous/bun": { + "speed": 0.44105098236203455, + "ci95": [ + 0.36899167853624804, + 0.5308014020359785 + ] + }, + "candidate/interpreter": { + "speed": 37.81583201988648, + "ci95": [ + 37.45407290048786, + 38.070942575795506 + ] + } + }, + "compilation_quiet_samples": 28, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "property-heavy", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1066737.5, + "fixed_batch_median_ns": 1064371.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.0265539768616152, + "ci95": [ + 0.026400967270699766, + 0.02676036937165118 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.01166715312729992, + "ci95": [ + 0.009801201626737333, + 0.014078247299799373 + ] + }, + "candidate/interpreter": { + "speed": 1.0003449044584776, + "ci95": [ + 0.9987210653812278, + 1.0019177997231237 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "property-heavy", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 9502.5, + "fixed_batch_median_ns": 25674.0, + "outlier_batches": 19, + "outlier_processes": 19, + "comparisons": { + "previous/automatic": { + "speed": 2.2759602597039432, + "ci95": [ + 1.8907847711486245, + 2.728891401830826 + ] + }, + "previous/interpreter": { + "speed": 85.71071186681388, + "ci95": [ + 71.07354890930004, + 102.87549085973423 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 85.74027387347601, + "ci95": [ + 70.75160734498346, + 102.38548683804872 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "property-heavy", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1067267.5, + "fixed_batch_median_ns": 1065848.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.026544821434353005, + "ci95": [ + 0.02639055115131865, + 0.026756137620277374 + ] + }, + "previous/interpreter": { + "speed": 0.9996552144595926, + "ci95": [ + 0.9980966890041016, + 1.0012701565332252 + ] + }, + "previous/bun": { + "speed": 0.01166313046160391, + "ci95": [ + 0.009753089643912772, + 0.014073331532191126 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "fibonacci-iterative", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 783799.5, + "fixed_batch_median_ns": 783462.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 45.37375898909613, + "ci95": [ + 45.036558627491665, + 45.660801516743355 + ] + }, + "previous/bun": { + "speed": 0.22177735167073273, + "ci95": [ + 0.21582846184882598, + 0.227509982779975 + ] + }, + "candidate/interpreter": { + "speed": 45.45689812196622, + "ci95": [ + 45.08397561800779, + 45.79856052258379 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "fibonacci-iterative", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 761677.5, + "fixed_batch_median_ns": 761426.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0072716925806184, + "ci95": [ + 0.9650986946598907, + 1.0320459357423089 + ] + }, + "previous/interpreter": { + "speed": 45.70370301569193, + "ci95": [ + 43.735746342729136, + 46.88664625743643 + ] + }, + "previous/bun": { + "speed": 0.22339004839342602, + "ci95": [ + 0.2106998110600998, + 0.232757455288354 + ] + }, + "candidate/interpreter": { + "speed": 45.78744671077764, + "ci95": [ + 43.84729250501162, + 47.000416580951736 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "fibonacci-iterative", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 35520549.5, + "fixed_batch_median_ns": 35511303.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.022039170266680178, + "ci95": [ + 0.021900769364999503, + 0.022209582666315675 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.004887788814764688, + "ci95": [ + 0.004767514613528414, + 0.005000440588326374 + ] + }, + "candidate/interpreter": { + "speed": 1.0018323175051476, + "ci95": [ + 0.9989661722691321, + 1.004854640753055 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "fibonacci-iterative", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 181338.0, + "fixed_batch_median_ns": 156181.5, + "outlier_batches": 22, + "outlier_processes": 22, + "comparisons": { + "previous/automatic": { + "speed": 4.509026699374942, + "ci95": [ + 4.396147369041571, + 4.635032995303792 + ] + }, + "previous/interpreter": { + "speed": 204.59149073283822, + "ci95": [ + 199.99470615769877, + 209.7266515853017 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 204.9663673027124, + "ci95": [ + 200.26368172601022, + 209.87225618035563 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "fibonacci-iterative", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 35564472.5, + "fixed_batch_median_ns": 35538534.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02199886136790245, + "ci95": [ + 0.021833279949326323, + 0.02217410329642528 + ] + }, + "previous/interpreter": { + "speed": 0.9981710337417437, + "ci95": [ + 0.9950759823486063, + 1.001096615329077 + ] + }, + "previous/bun": { + "speed": 0.004878849213944997, + "ci95": [ + 0.004760456223419954, + 0.004992470615695955 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "fibonacci-recursive", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 363011.0, + "fixed_batch_median_ns": 359273.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 27.099021347563376, + "ci95": [ + 26.80120074285639, + 27.345101688272024 + ] + }, + "previous/bun": { + "speed": 0.7310641099177887, + "ci95": [ + 0.719097230038744, + 0.7432094043316109 + ] + }, + "candidate/interpreter": { + "speed": 27.061345872650058, + "ci95": [ + 26.75387448080319, + 27.309607051609344 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "fibonacci-recursive", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 361359.0, + "fixed_batch_median_ns": 361814.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0023897810889542, + "ci95": [ + 0.98819875089314, + 1.0178849578475038 + ] + }, + "previous/interpreter": { + "speed": 27.163782076308944, + "ci95": [ + 26.89709865581221, + 27.413716870594122 + ] + }, + "previous/bun": { + "speed": 0.7328111931024832, + "ci95": [ + 0.7211715479290548, + 0.744870946842825 + ] + }, + "candidate/interpreter": { + "speed": 27.126016565258176, + "ci95": [ + 26.87325387607966, + 27.35045802467022 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "fibonacci-recursive", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 9902499.5, + "fixed_batch_median_ns": 9912115.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03690170162140986, + "ci95": [ + 0.03656875053413227, + 0.037315934681388115 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.02697750965030782, + "ci95": [ + 0.026611893888893817, + 0.02736796079202105 + ] + }, + "candidate/interpreter": { + "speed": 0.9986097108663041, + "ci95": [ + 0.9954271255610178, + 1.0008712017505028 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "fibonacci-recursive", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 266246.0, + "fixed_batch_median_ns": 265163.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.3678690916894476, + "ci95": [ + 1.3453425867410078, + 1.3900053327304545 + ] + }, + "previous/interpreter": { + "speed": 37.067913716364465, + "ci95": [ + 36.53883695921647, + 37.59154399007651 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 37.01637859871583, + "ci95": [ + 36.503111259827556, + 37.4957588506176 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "fibonacci-recursive", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 9906134.5, + "fixed_batch_median_ns": 9908815.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.0369530770829349, + "ci95": [ + 0.036615966514889985, + 0.03736888261630552 + ] + }, + "previous/interpreter": { + "speed": 1.0013922247286078, + "ci95": [ + 0.9991490042542117, + 1.0046117785186142 + ] + }, + "previous/bun": { + "speed": 0.027015068406359227, + "ci95": [ + 0.026659169419320235, + 0.02739076540332884 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "collections", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1595977.5, + "fixed_batch_median_ns": 1598186.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9789463946423169, + "ci95": [ + 0.9521340394012566, + 0.9954354096915956 + ] + }, + "previous/bun": { + "speed": 0.025899991857655662, + "ci95": [ + 0.02467322968512169, + 0.027327503333209314 + ] + }, + "candidate/interpreter": { + "speed": 0.9767415886648324, + "ci95": [ + 0.9508689697550896, + 0.9917032404464929 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "collections", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1596841.0, + "fixed_batch_median_ns": 1601638.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0071890285736076, + "ci95": [ + 0.988485558020395, + 1.037101433342974 + ] + }, + "previous/interpreter": { + "speed": 0.9859840682454307, + "ci95": [ + 0.9789290509653534, + 0.9912156826974382 + ] + }, + "previous/bun": { + "speed": 0.026086187639176556, + "ci95": [ + 0.02512355537105707, + 0.027230515219317172 + ] + }, + "candidate/interpreter": { + "speed": 0.9837634118547748, + "ci95": [ + 0.975330838903735, + 0.9902296614611931 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "collections", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1577751.5, + "fixed_batch_median_ns": 1573914.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0215063924571433, + "ci95": [ + 1.0044436149515932, + 1.0504819080986467 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.026457007247183226, + "ci95": [ + 0.025423661342438425, + 0.027754028421202163 + ] + }, + "candidate/interpreter": { + "speed": 0.9977477765998718, + "ci95": [ + 0.9915193653593389, + 1.0026296001013 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "collections", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 39870.5, + "fixed_batch_median_ns": 43418.5, + "outlier_batches": 2, + "outlier_processes": 2, + "comparisons": { + "previous/automatic": { + "speed": 38.61005074812078, + "ci95": [ + 36.636076787313684, + 40.48938436809801 + ] + }, + "previous/interpreter": { + "speed": 37.797169976829714, + "ci95": [ + 36.01870819632798, + 39.34680313018188 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 37.71204230614928, + "ci95": [ + 35.94386045029869, + 39.235431360934 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "collections", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1576363.5, + "fixed_batch_median_ns": 1577351.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0238122463557233, + "ci95": [ + 1.0083371162749306, + 1.05164851737201 + ] + }, + "previous/interpreter": { + "speed": 1.002257307360587, + "ci95": [ + 0.9972369900610234, + 1.0082956525734519 + ] + }, + "previous/bun": { + "speed": 0.026516728844381394, + "ci95": [ + 0.02546081264081165, + 0.02781486124538417 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "for-of-array", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 169795.0, + "fixed_batch_median_ns": 169902.5, + "outlier_batches": 18, + "outlier_processes": 18, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 2.6875139561669577, + "ci95": [ + 2.5818718748503566, + 2.757457329647286 + ] + }, + "previous/bun": { + "speed": 0.18337502324621613, + "ci95": [ + 0.1524494037958099, + 0.2161868230717447 + ] + }, + "candidate/interpreter": { + "speed": 2.741168361613545, + "ci95": [ + 2.6001167745482747, + 2.8908786744331847 + ] + } + }, + "compilation_quiet_samples": 5, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "for-of-array", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 463785.0, + "fixed_batch_median_ns": 463156.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.3632386830064192, + "ci95": [ + 0.35098925259611724, + 0.3752109266977319 + ] + }, + "previous/interpreter": { + "speed": 0.9762090299994571, + "ci95": [ + 0.9445833399983868, + 1.0001996790372834 + ] + }, + "previous/bun": { + "speed": 0.06660890194022705, + "ci95": [ + 0.05600751479223807, + 0.07808110985047596 + ] + }, + "candidate/interpreter": { + "speed": 0.9956983855713678, + "ci95": [ + 0.9521486140502463, + 1.0469342586712136 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "for-of-array", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 458155.5, + "fixed_batch_median_ns": 457150.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.37209109098962256, + "ci95": [ + 0.3627788482041669, + 0.3875116796858885 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.06823221245993195, + "ci95": [ + 0.057768857580080914, + 0.08015003449017098 + ] + }, + "candidate/interpreter": { + "speed": 1.0199643262590201, + "ci95": [ + 0.9903946007669819, + 1.0662854858052662 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "for-of-array", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 42293.0, + "fixed_batch_median_ns": 42195.5, + "outlier_batches": 10, + "outlier_processes": 9, + "comparisons": { + "previous/automatic": { + "speed": 5.453305375494394, + "ci95": [ + 4.610313431630128, + 6.561776183686819 + ] + }, + "previous/interpreter": { + "speed": 14.655834303881479, + "ci95": [ + 12.466381704655353, + 17.3262284265247 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 14.948428161522305, + "ci95": [ + 12.562142226301185, + 17.97811401175377 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "for-of-array", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 459077.0, + "fixed_batch_median_ns": 458786.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.36480794613117673, + "ci95": [ + 0.34653837737612614, + 0.3840168755124466 + ] + }, + "previous/interpreter": { + "speed": 0.9804264465481413, + "ci95": [ + 0.9383708147421024, + 1.0099962740843977 + ] + }, + "previous/bun": { + "speed": 0.0668966656022089, + "ci95": [ + 0.05519828225541909, + 0.07945873289055763 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "strings-json", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1990673.0, + "fixed_batch_median_ns": 1988310.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9525033552574741, + "ci95": [ + 0.9409917397932144, + 0.9655874818262661 + ] + }, + "previous/bun": { + "speed": 0.038041907469798415, + "ci95": [ + 0.03670897435649883, + 0.039608415182487956 + ] + }, + "candidate/interpreter": { + "speed": 0.9615598362629889, + "ci95": [ + 0.9511913664713197, + 0.9696850591297023 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "strings-json", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1996968.5, + "fixed_batch_median_ns": 1998583.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9972410720593629, + "ci95": [ + 0.9891504786503612, + 1.00769554590939 + ] + }, + "previous/interpreter": { + "speed": 0.9498754671371037, + "ci95": [ + 0.9420402069357771, + 0.9611116288492245 + ] + }, + "previous/bun": { + "speed": 0.03793695258836486, + "ci95": [ + 0.03663769376018974, + 0.03949223149786346 + ] + }, + "candidate/interpreter": { + "speed": 0.9589069619641285, + "ci95": [ + 0.9535593479287697, + 0.9642284196848675 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "strings-json", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1896331.5, + "fixed_batch_median_ns": 1900914.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.049865068170481, + "ci95": [ + 1.035447332826923, + 1.0632766432796303 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.03993886977911504, + "ci95": [ + 0.038413298625276426, + 0.04165136829866008 + ] + }, + "candidate/interpreter": { + "speed": 1.0095080830482395, + "ci95": [ + 0.9977529575223347, + 1.0179976610724328 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "strings-json", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 71322.5, + "fixed_batch_median_ns": 72388.5, + "outlier_batches": 5, + "outlier_processes": 5, + "comparisons": { + "previous/automatic": { + "speed": 26.28679965098761, + "ci95": [ + 25.261590780589703, + 27.250642271907026 + ] + }, + "previous/interpreter": { + "speed": 25.038264866546704, + "ci95": [ + 23.988528989574966, + 26.037254358015208 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 25.276330768281646, + "ci95": [ + 24.306422953655474, + 26.19885087311752 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "strings-json", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1913186.0, + "fixed_batch_median_ns": 1919471.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0399768816118664, + "ci95": [ + 1.0312332573674277, + 1.0512972494413322 + ] + }, + "previous/interpreter": { + "speed": 0.9905814691255076, + "ci95": [ + 0.9821973413217377, + 1.0023412422702997 + ] + }, + "previous/bun": { + "speed": 0.03956270430100811, + "ci95": [ + 0.03818774221256665, + 0.041197259238396976 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "calls-closures", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 3196927.0, + "fixed_batch_median_ns": 3390618.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 1.0006772425241697, + "ci95": [ + 0.994719828881176, + 1.0067839094815125 + ] + }, + "previous/bun": { + "speed": 0.030768562927761294, + "ci95": [ + 0.029355260808112623, + 0.03264678910313873 + ] + }, + "candidate/interpreter": { + "speed": 1.0115657145346788, + "ci95": [ + 1.0068446845055437, + 1.0160984987672428 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "calls-closures", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 3211920.5, + "fixed_batch_median_ns": 3279658.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9853947493199671, + "ci95": [ + 0.9696102616501395, + 0.9976328789917268 + ] + }, + "previous/interpreter": { + "speed": 0.9860621005473001, + "ci95": [ + 0.9714492766522745, + 0.9970445091229679 + ] + }, + "previous/bun": { + "speed": 0.030319180353136965, + "ci95": [ + 0.028842520866442036, + 0.0322352057263864 + ] + }, + "candidate/interpreter": { + "speed": 0.996791543694573, + "ci95": [ + 0.9823500156944657, + 1.0075811532049848 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "calls-closures", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 3201160.5, + "fixed_batch_median_ns": 3197508.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9993232158228547, + "ci95": [ + 0.993345673784406, + 1.0051719056057984 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.030747739251218282, + "ci95": [ + 0.029333582714622834, + 0.032703157233296726 + ] + }, + "candidate/interpreter": { + "speed": 1.010881102864939, + "ci95": [ + 1.0057921304174207, + 1.015432224822421 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "calls-closures", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 93810.0, + "fixed_batch_median_ns": 93689.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 32.50070542286323, + "ci95": [ + 30.649677645293977, + 34.0815066390298 + ] + }, + "previous/interpreter": { + "speed": 32.52271628264111, + "ci95": [ + 30.626634321337455, + 34.09146144655463 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 32.87659930395976, + "ci95": [ + 30.96091278783377, + 34.45891753731116 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "calls-closures", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 3238647.0, + "fixed_batch_median_ns": 3229905.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.988566521810203, + "ci95": [ + 0.9842340038106081, + 0.9932154473486613 + ] + }, + "previous/interpreter": { + "speed": 0.9892360210967435, + "ci95": [ + 0.9847876079975022, + 0.994172034487984 + ] + }, + "previous/bun": { + "speed": 0.030416771234595328, + "ci95": [ + 0.029010890006889927, + 0.03225263502759491 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "adversarial", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 952684.0, + "fixed_batch_median_ns": 953156.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9694984082811957, + "ci95": [ + 0.948569865312232, + 0.9826067780387601 + ] + }, + "previous/bun": { + "speed": 0.03736539512660695, + "ci95": [ + 0.03653862273150687, + 0.03792340025086048 + ] + }, + "candidate/interpreter": { + "speed": 0.9919286379137287, + "ci95": [ + 0.9615296526772245, + 1.024563030462066 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "adversarial", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 950781.5, + "fixed_batch_median_ns": 950592.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0067216191122714, + "ci95": [ + 0.9860056692570675, + 1.0308206870532197 + ] + }, + "previous/interpreter": { + "speed": 0.9760150073116154, + "ci95": [ + 0.9630674868758891, + 0.984243182321 + ] + }, + "previous/bun": { + "speed": 0.037616551080627524, + "ci95": [ + 0.03712936328634151, + 0.03798384511082072 + ] + }, + "candidate/interpreter": { + "speed": 0.9985960044043389, + "ci95": [ + 0.9734993165170415, + 1.029266841414814 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "adversarial", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 936844.0, + "fixed_batch_median_ns": 935786.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.031461208660342, + "ci95": [ + 1.0177887909256025, + 1.053845398898775 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.03854095561936126, + "ci95": [ + 0.03836925118447728, + 0.03872982464257861 + ] + }, + "candidate/interpreter": { + "speed": 1.0231359117673013, + "ci95": [ + 1.002484148567114, + 1.0522002214169448 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "adversarial", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 36093.0, + "fixed_batch_median_ns": 36282.0, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 26.762730505368733, + "ci95": [ + 26.36428749756558, + 27.357396018120387 + ] + }, + "previous/interpreter": { + "speed": 25.946424626213588, + "ci95": [ + 25.82323094393926, + 26.062022749523877 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 26.546718817042603, + "ci95": [ + 25.958686868432213, + 27.314740723575852 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "adversarial", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 937016.5, + "fixed_batch_median_ns": 937837.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0081370390749556, + "ci95": [ + 0.9757455383492083, + 1.0397616682736814 + ] + }, + "previous/interpreter": { + "speed": 0.977387254712487, + "ci95": [ + 0.9518937595476465, + 0.9977974576589614 + ] + }, + "previous/bun": { + "speed": 0.0376694388068033, + "ci95": [ + 0.03662258783820234, + 0.038509088847644236 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "float64-dense", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 102205.0, + "fixed_batch_median_ns": 101149.5, + "outlier_batches": 21, + "outlier_processes": 20, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 22.89059917484408, + "ci95": [ + 22.317330076569405, + 23.62205688113403 + ] + }, + "previous/bun": { + "speed": 0.6412333458727764, + "ci95": [ + 0.63225887013951, + 0.6494604553066282 + ] + }, + "candidate/interpreter": { + "speed": 22.87192660332844, + "ci95": [ + 22.360485654963483, + 23.537321018906518 + ] + } + }, + "compilation_quiet_samples": 5, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "float64-dense", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 105921.0, + "fixed_batch_median_ns": 106233.0, + "outlier_batches": 29, + "outlier_processes": 26, + "comparisons": { + "previous/automatic": { + "speed": 0.9686829323172773, + "ci95": [ + 0.9475761665502049, + 0.9871112533311983 + ] + }, + "previous/interpreter": { + "speed": 22.17373273118741, + "ci95": [ + 21.559382724980505, + 22.89853717587818 + ] + }, + "previous/bun": { + "speed": 0.6211517977796599, + "ci95": [ + 0.6104418756047467, + 0.6312978008550727 + ] + }, + "candidate/interpreter": { + "speed": 22.155644929857733, + "ci95": [ + 21.511938723694122, + 22.93435795880796 + ] + } + }, + "compilation_quiet_samples": 4, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "float64-dense", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2291963.5, + "fixed_batch_median_ns": 2301898.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.04368605611245698, + "ci95": [ + 0.042329838579143166, + 0.044785071666393804 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.028012955928976648, + "ci95": [ + 0.02707552469163711, + 0.028795832565762753 + ] + }, + "candidate/interpreter": { + "speed": 0.999184268993004, + "ci95": [ + 0.9705814386906054, + 1.0309113445692408 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "float64-dense", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 65540.0, + "fixed_batch_median_ns": 67387.5, + "outlier_batches": 5, + "outlier_processes": 5, + "comparisons": { + "previous/automatic": { + "speed": 1.559494693213295, + "ci95": [ + 1.53970899147996, + 1.5819755849049255 + ] + }, + "previous/interpreter": { + "speed": 35.69776793764196, + "ci95": [ + 34.73750205731539, + 36.92807320153198 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 35.66864816145469, + "ci95": [ + 34.87414058756908, + 36.728796662402786 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "float64-dense", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2302158.5, + "fixed_batch_median_ns": 2290844.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.04372172127618121, + "ci95": [ + 0.042463761682468966, + 0.04470845045692857 + ] + }, + "previous/interpreter": { + "speed": 1.0008163969673163, + "ci95": [ + 0.9711359586519367, + 1.0305638035944673 + ] + }, + "previous/bun": { + "speed": 0.028035825621242624, + "ci95": [ + 0.027226574341722088, + 0.028657413381550232 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "strings-regexp", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 19929896.0, + "fixed_batch_median_ns": 20083920.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9979424049212738, + "ci95": [ + 0.9670707830022552, + 1.0460744795726409 + ] + }, + "previous/bun": { + "speed": 0.05526161121914633, + "ci95": [ + 0.051737223580535785, + 0.059705166047380104 + ] + }, + "candidate/interpreter": { + "speed": 1.0621262338799058, + "ci95": [ + 0.9967503060656117, + 1.1484037606944193 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "strings-regexp", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 20321006.5, + "fixed_batch_median_ns": 20356526.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9635016343189714, + "ci95": [ + 0.9180238225904682, + 0.9944091120894115 + ] + }, + "previous/interpreter": { + "speed": 0.961519138097852, + "ci95": [ + 0.9050687742458708, + 1.0181747882803212 + ] + }, + "previous/bun": { + "speed": 0.0532446527247471, + "ci95": [ + 0.05081710023379048, + 0.056288557553246625 + ] + }, + "candidate/interpreter": { + "speed": 1.0233603621963434, + "ci95": [ + 0.9752426404258719, + 1.0841738311141382 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "strings-regexp", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 19569870.5, + "fixed_batch_median_ns": 19669465.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0020618375054304, + "ci95": [ + 0.9550123250576936, + 1.0341155889852323 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.05537555168176849, + "ci95": [ + 0.05253880978356284, + 0.05910528467859434 + ] + }, + "candidate/interpreter": { + "speed": 1.064316165584421, + "ci95": [ + 1.0109361643810904, + 1.1344177917494696 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "strings-regexp", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1025552.0, + "fixed_batch_median_ns": 1252601.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 18.095744549220328, + "ci95": [ + 16.745696995649766, + 19.314869485086877 + ] + }, + "previous/interpreter": { + "speed": 18.05851083428996, + "ci95": [ + 16.93805198735699, + 19.038119447820314 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 19.219965007316222, + "ci95": [ + 18.861075656976478, + 19.524361693390045 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "strings-regexp", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 19708191.0, + "fixed_batch_median_ns": 19686162.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9415076740426972, + "ci95": [ + 0.8709192588807773, + 1.0040690792318354 + ] + }, + "previous/interpreter": { + "speed": 0.939570432486004, + "ci95": [ + 0.880287903874908, + 0.9894072959589628 + ] + }, + "previous/bun": { + "speed": 0.05202923104279028, + "ci95": [ + 0.05121274852055805, + 0.053009757334399214 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "arrays-typed", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1899233.0, + "fixed_batch_median_ns": 1905755.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 2.1844744985596236, + "ci95": [ + 2.1692205472035355, + 2.1987345041528656 + ] + }, + "previous/bun": { + "speed": 0.024469439215987467, + "ci95": [ + 0.023797010154576744, + 0.02536121071091028 + ] + }, + "candidate/interpreter": { + "speed": 2.1983616367570895, + "ci95": [ + 2.1840507749852307, + 2.2160602444987125 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 30, + 30 + ] + }, + { + "workload": "arrays-typed", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1902456.5, + "fixed_batch_median_ns": 1897078.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9984116450118716, + "ci95": [ + 0.9927015449842679, + 1.0047470983423912 + ] + }, + "previous/interpreter": { + "speed": 2.1810047775933974, + "ci95": [ + 2.1669882330942984, + 2.195573542899937 + ] + }, + "previous/bun": { + "speed": 0.024430573060152044, + "ci95": [ + 0.02377024983175888, + 0.025288191788892973 + ] + }, + "candidate/interpreter": { + "speed": 2.194869858085636, + "ci95": [ + 2.179551031554704, + 2.213751835149603 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 30, + 30 + ] + }, + { + "workload": "arrays-typed", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 4139674.5, + "fixed_batch_median_ns": 4138048.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.4577760008914591, + "ci95": [ + 0.4547498555111557, + 0.4609789054493519 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.011201522028351384, + "ci95": [ + 0.010919431979149926, + 0.011557326665856689 + ] + }, + "candidate/interpreter": { + "speed": 1.0063571985878628, + "ci95": [ + 0.999048856889312, + 1.0142391363797074 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "arrays-typed", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 45362.0, + "fixed_batch_median_ns": 45554.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 40.86730354435893, + "ci95": [ + 39.46825721973139, + 42.02397960829635 + ] + }, + "previous/interpreter": { + "speed": 89.2735824175474, + "ci95": [ + 86.49872298887219, + 91.58572239734775 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 89.84111230962571, + "ci95": [ + 86.80433191074536, + 92.27450369174277 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "arrays-typed", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 4168973.5, + "fixed_batch_median_ns": 4176446.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.4548842116236839, + "ci95": [ + 0.4512899928904699, + 0.4579041414099749 + ] + }, + "previous/interpreter": { + "speed": 0.9936829600893367, + "ci95": [ + 0.9856875012740403, + 1.0007819224953889 + ] + }, + "previous/bun": { + "speed": 0.01113076156663811, + "ci95": [ + 0.010834614360735764, + 0.01152297197111237 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "packed-array-traversal", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 30133.5, + "fixed_batch_median_ns": 30123.5, + "outlier_batches": 10, + "outlier_processes": 10, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 27.223359432368415, + "ci95": [ + 26.953871712571004, + 27.44838676587948 + ] + }, + "previous/bun": { + "speed": 0.49108752288899826, + "ci95": [ + 0.47882104792292807, + 0.5024816064434166 + ] + }, + "candidate/interpreter": { + "speed": 27.212072360201258, + "ci95": [ + 26.926537193803384, + 27.446909562928983 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "packed-array-traversal", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 30322.5, + "fixed_batch_median_ns": 30334.0, + "outlier_batches": 7, + "outlier_processes": 7, + "comparisons": { + "previous/automatic": { + "speed": 0.9811721151597299, + "ci95": [ + 0.9654319225107042, + 0.9977318748953696 + ] + }, + "previous/interpreter": { + "speed": 26.710801156010497, + "ci95": [ + 26.3468119659138, + 27.04842780449041 + ] + }, + "previous/bun": { + "speed": 0.48184138356155065, + "ci95": [ + 0.4681153283927158, + 0.49505731569559736 + ] + }, + "candidate/interpreter": { + "speed": 26.699726595538287, + "ci95": [ + 26.345087171731247, + 27.03602213643735 + ] + } + }, + "compilation_quiet_samples": 17, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "packed-array-traversal", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 826864.5, + "fixed_batch_median_ns": 826686.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03673315934737304, + "ci95": [ + 0.036427711737990295, + 0.037103058559111675 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.01803919623178828, + "ci95": [ + 0.017618959242594594, + 0.01842175031370418 + ] + }, + "candidate/interpreter": { + "speed": 0.9995853901795184, + "ci95": [ + 0.9976372500223034, + 1.0015499082868387 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "packed-array-traversal", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 15130.5, + "fixed_batch_median_ns": 15008.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 2.036296899007211, + "ci95": [ + 1.9901310324379653, + 2.087214249887949 + ] + }, + "previous/interpreter": { + "speed": 55.43484239269052, + "ci95": [ + 54.287389103130764, + 56.788904993974434 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 55.41185856263764, + "ci95": [ + 54.229573939602744, + 56.77191031252084 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "packed-array-traversal", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 826574.0, + "fixed_batch_median_ns": 827065.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03674839559307287, + "ci95": [ + 0.03643538952529423, + 0.037136705934041024 + ] + }, + "previous/interpreter": { + "speed": 1.0004147817930864, + "ci95": [ + 0.9984440049357884, + 1.0023146517947337 + ] + }, + "previous/bun": { + "speed": 0.018046678561947145, + "ci95": [ + 0.017603688218689812, + 0.018440968593218348 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "int32array-traversal", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 28106.0, + "fixed_batch_median_ns": 28083.5, + "outlier_batches": 5, + "outlier_processes": 5, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 36.3287953906879, + "ci95": [ + 35.76080991637399, + 36.910169727669086 + ] + }, + "previous/bun": { + "speed": 0.5220367474907002, + "ci95": [ + 0.5134841694930631, + 0.5295531124420187 + ] + }, + "candidate/interpreter": { + "speed": 36.37908349576646, + "ci95": [ + 35.774569461379535, + 37.009781028965776 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "int32array-traversal", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 27909.5, + "fixed_batch_median_ns": 27876.5, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 1.0188567298734241, + "ci95": [ + 1.005577792587702, + 1.0337167790079413 + ] + }, + "previous/interpreter": { + "speed": 37.013837671997, + "ci95": [ + 36.590964695552195, + 37.43878502755301 + ] + }, + "previous/bun": { + "speed": 0.5318806534221332, + "ci95": [ + 0.5244029308634244, + 0.5378448912406666 + ] + }, + "candidate/interpreter": { + "speed": 37.06507404628886, + "ci95": [ + 36.5875017754634, + 37.5926781658345 + ] + } + }, + "compilation_quiet_samples": 28, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "int32array-traversal", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1032127.5, + "fixed_batch_median_ns": 1032072.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02752637375519278, + "ci95": [ + 0.02710914562106259, + 0.02797225606269067 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.014369778625374202, + "ci95": [ + 0.014175296635254435, + 0.014518368431163563 + ] + }, + "candidate/interpreter": { + "speed": 1.0013842491758325, + "ci95": [ + 0.9891628697604973, + 1.015165399606508 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "int32array-traversal", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 15009.0, + "fixed_batch_median_ns": 14958.5, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 1.91557396065842, + "ci95": [ + 1.8871666590430234, + 1.947553204098066 + ] + }, + "previous/interpreter": { + "speed": 69.59049447248942, + "ci95": [ + 68.87127302472847, + 70.53821552158514 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 69.68682505710869, + "ci95": [ + 68.77395125320075, + 71.25079851456144 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "int32array-traversal", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1032814.5, + "fixed_batch_median_ns": 1032896.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.02748832306664276, + "ci95": [ + 0.027005238688185502, + 0.02794918910192063 + ] + }, + "previous/interpreter": { + "speed": 0.9986176643211917, + "ci95": [ + 0.984599691035991, + 1.0111785881136093 + ] + }, + "previous/bun": { + "speed": 0.01434991476768378, + "ci95": [ + 0.014032832893819165, + 0.014539549643702628 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "float64array-traversal", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 57224.5, + "fixed_batch_median_ns": 57183.5, + "outlier_batches": 23, + "outlier_processes": 23, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 26.362541012940213, + "ci95": [ + 26.19882048358252, + 26.5386040339063 + ] + }, + "previous/bun": { + "speed": 0.1442763992615272, + "ci95": [ + 0.14344992330495052, + 0.1450167644906059 + ] + }, + "candidate/interpreter": { + "speed": 26.56878307257723, + "ci95": [ + 26.421029905277038, + 26.711590211084324 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "float64array-traversal", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 56780.0, + "fixed_batch_median_ns": 56826.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.01131992059962, + "ci95": [ + 1.0074916824025462, + 1.0158703468701202 + ] + }, + "previous/interpreter": { + "speed": 26.660962884010914, + "ci95": [ + 26.56143735965929, + 26.796421704755335 + ] + }, + "previous/bun": { + "speed": 0.14590959664556674, + "ci95": [ + 0.14538108194701604, + 0.1463766678322044 + ] + }, + "candidate/interpreter": { + "speed": 26.869539587387322, + "ci95": [ + 26.747737204510308, + 27.022353105434355 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "float64array-traversal", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1510635.5, + "fixed_batch_median_ns": 1508870.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03793261049870511, + "ci95": [ + 0.037678727494529864, + 0.03816737430813921 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.005472780457343177, + "ci95": [ + 0.0054452916046956925, + 0.005495707518534015 + ] + }, + "candidate/interpreter": { + "speed": 1.0078232997166616, + "ci95": [ + 1.0017969110811, + 1.014364970667017 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "float64array-traversal", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 8305.0, + "fixed_batch_median_ns": 8320.5, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 6.9311405407846225, + "ci95": [ + 6.896059896679027, + 6.9711520736054435 + ] + }, + "previous/interpreter": { + "speed": 182.72247677288726, + "ci95": [ + 181.957755719738, + 183.68261184732495 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 184.15196947365231, + "ci95": [ + 183.23625360747042, + 185.22346877791284 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "float64array-traversal", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1522589.5, + "fixed_batch_median_ns": 1524594.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03763815592412823, + "ci95": [ + 0.03743967989747562, + 0.0378460250178164 + ] + }, + "previous/interpreter": { + "speed": 0.9922374292012688, + "ci95": [ + 0.98587945845905, + 0.9982935063747281 + ] + }, + "previous/bun": { + "speed": 0.005430297611577138, + "ci95": [ + 0.005398088310169403, + 0.005457247006210137 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "typed-convert-traversal", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 57080.0, + "fixed_batch_median_ns": 57056.0, + "outlier_batches": 29, + "outlier_processes": 23, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 26.36931906910107, + "ci95": [ + 25.907492148168885, + 26.83451789155881 + ] + }, + "previous/bun": { + "speed": 0.14244564947372423, + "ci95": [ + 0.1398975451605366, + 0.1448705801770152 + ] + }, + "candidate/interpreter": { + "speed": 26.7797357093065, + "ci95": [ + 26.005177987035843, + 27.996337388146305 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "typed-convert-traversal", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 56934.5, + "fixed_batch_median_ns": 56887.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0050534059397702, + "ci95": [ + 0.9906188112924813, + 1.021545970053115 + ] + }, + "previous/interpreter": { + "speed": 26.502573942712566, + "ci95": [ + 26.109134521312505, + 26.936825342322436 + ] + }, + "previous/bun": { + "speed": 0.14316548516486918, + "ci95": [ + 0.14131428525188727, + 0.1452850910120672 + ] + }, + "candidate/interpreter": { + "speed": 26.91506458480539, + "ci95": [ + 26.35946442114494, + 27.85296557114025 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "typed-convert-traversal", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1500347.0, + "fixed_batch_median_ns": 1499432.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03792286017623321, + "ci95": [ + 0.037259161989078665, + 0.03861146428444352 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.005401946447704772, + "ci95": [ + 0.005310040831049673, + 0.0054906175699438375 + ] + }, + "candidate/interpreter": { + "speed": 1.0155641728605098, + "ci95": [ + 0.9870429126369269, + 1.0614784195752016 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "typed-convert-traversal", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 8119.5, + "fixed_batch_median_ns": 8110.0, + "outlier_batches": 1, + "outlier_processes": 1, + "comparisons": { + "previous/automatic": { + "speed": 7.020221422658905, + "ci95": [ + 6.89953156257634, + 7.14687919790367 + ] + }, + "previous/interpreter": { + "speed": 185.1184586298313, + "ci95": [ + 182.14772266002754, + 188.26164434241682 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 187.99967431961716, + "ci95": [ + 182.88149910100847, + 196.5377777799178 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "typed-convert-traversal", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1508456.0, + "fixed_batch_median_ns": 1502090.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.03734166800057253, + "ci95": [ + 0.03570360958245442, + 0.038440237751811594 + ] + }, + "previous/interpreter": { + "speed": 0.9846743580795384, + "ci95": [ + 0.9413437165237837, + 1.0134582411856592 + ] + }, + "previous/bun": { + "speed": 0.005319158150773739, + "ci95": [ + 0.005091253272008011, + 0.005468424894542587 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "objects-polymorphic", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 4817726.0, + "fixed_batch_median_ns": 4811569.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 1.3198320289965326, + "ci95": [ + 1.2626024775529496, + 1.3992271232192135 + ] + }, + "previous/bun": { + "speed": 0.026275402432481387, + "ci95": [ + 0.024995510076359174, + 0.02797666874462706 + ] + }, + "candidate/interpreter": { + "speed": 1.3118398263721982, + "ci95": [ + 1.274575747139873, + 1.3693570253609086 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "objects-polymorphic", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 4792815.0, + "fixed_batch_median_ns": 4806988.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9809235399929325, + "ci95": [ + 0.9344001778455497, + 1.0104888201301618 + ] + }, + "previous/interpreter": { + "speed": 1.2946543060793334, + "ci95": [ + 1.251244761937742, + 1.358064529600467 + ] + }, + "previous/bun": { + "speed": 0.025774160768808552, + "ci95": [ + 0.024804239653802067, + 0.027144962401384195 + ] + }, + "candidate/interpreter": { + "speed": 1.2868145663887307, + "ci95": [ + 1.2109228950599915, + 1.3615033612632186 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "objects-polymorphic", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 6129313.5, + "fixed_batch_median_ns": 6142420.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.7576721719356206, + "ci95": [ + 0.7136407583859402, + 0.7920530926378141 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.019908141229500666, + "ci95": [ + 0.019376339319702014, + 0.02045415163646063 + ] + }, + "candidate/interpreter": { + "speed": 0.993944530479071, + "ci95": [ + 0.9333276905567572, + 1.0537872768502137 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "objects-polymorphic", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 121565.5, + "fixed_batch_median_ns": 124236.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 38.05840852750594, + "ci95": [ + 35.79571551061772, + 39.94973939386854 + ] + }, + "previous/interpreter": { + "speed": 50.230706547237105, + "ci95": [ + 48.92034892688253, + 51.605741435540274 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 49.926536034725586, + "ci95": [ + 46.56164336072693, + 53.00494701812828 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "objects-polymorphic", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 6259805.0, + "fixed_batch_median_ns": 6227236.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.7622881848048708, + "ci95": [ + 0.7295564206180056, + 0.7845660351271895 + ] + }, + "previous/interpreter": { + "speed": 1.0060923616310966, + "ci95": [ + 0.9493120416218653, + 1.075223700405925 + ] + }, + "previous/bun": { + "speed": 0.020029428825273726, + "ci95": [ + 0.01885122187845969, + 0.02144726593370052 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "property-polymorphic", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 565800.5, + "fixed_batch_median_ns": 565551.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 3.2872588101289497, + "ci95": [ + 3.266290832761351, + 3.3099918241683866 + ] + }, + "previous/bun": { + "speed": 0.04119589976129662, + "ci95": [ + 0.040963776514039346, + 0.041365647412616446 + ] + }, + "candidate/interpreter": { + "speed": 3.272814046345714, + "ci95": [ + 3.2541043126479443, + 3.2871837988337878 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "property-polymorphic", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 564503.5, + "fixed_batch_median_ns": 564604.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0030321238422326, + "ci95": [ + 0.9981752689515526, + 1.0090053674028483 + ] + }, + "previous/interpreter": { + "speed": 3.297226185942731, + "ci95": [ + 3.2807416841417982, + 3.3197183977477955 + ] + }, + "previous/bun": { + "speed": 0.04132081083116509, + "ci95": [ + 0.04117401547710643, + 0.04144257189557609 + ] + }, + "candidate/interpreter": { + "speed": 3.2827376238468324, + "ci95": [ + 3.2694251479519667, + 3.2942985652346617 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "property-polymorphic", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1860278.0, + "fixed_batch_median_ns": 1858707.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.3042048277180746, + "ci95": [ + 0.302109484784737, + 0.30615831869098786 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.012531991589576307, + "ci95": [ + 0.012458807111093283, + 0.012576892070441947 + ] + }, + "candidate/interpreter": { + "speed": 0.9956058331218923, + "ci95": [ + 0.98913110240725, + 0.9996647249678902 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "property-polymorphic", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 23392.0, + "fixed_batch_median_ns": 23359.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 24.274260443256445, + "ci95": [ + 24.175133833515257, + 24.410657593525883 + ] + }, + "previous/interpreter": { + "speed": 79.7957765014594, + "ci95": [ + 79.510636693587, + 80.25245993058486 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 79.44514054334384, + "ci95": [ + 79.3335986801208, + 79.55941158711613 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "property-polymorphic", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 1858276.0, + "fixed_batch_median_ns": 1851634.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.305547454221103, + "ci95": [ + 0.3041897782370813, + 0.3072544496002132 + ] + }, + "previous/interpreter": { + "speed": 1.004413560800793, + "ci95": [ + 1.0003849655458037, + 1.010771115024912 + ] + }, + "previous/bun": { + "speed": 0.012587302296411924, + "ci95": [ + 0.012569162146427762, + 0.012604888575138659 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "calls-recursion-closures", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 6574813.5, + "fixed_batch_median_ns": 6559325.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9838754032342117, + "ci95": [ + 0.9647948195834352, + 0.9970835928396972 + ] + }, + "previous/bun": { + "speed": 0.02007335451900182, + "ci95": [ + 0.01911243633996196, + 0.021433284915709967 + ] + }, + "candidate/interpreter": { + "speed": 0.9962650327711741, + "ci95": [ + 0.96806071247648, + 1.027188065122365 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "calls-recursion-closures", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 6606954.5, + "fixed_batch_median_ns": 6612183.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0031996790652489, + "ci95": [ + 0.987139675661857, + 1.0262740827705765 + ] + }, + "previous/interpreter": { + "speed": 0.9870234887647535, + "ci95": [ + 0.9790664561449525, + 0.9941164159519403 + ] + }, + "previous/bun": { + "speed": 0.020137582811225584, + "ci95": [ + 0.019176201296446944, + 0.02147776695533647 + ] + }, + "candidate/interpreter": { + "speed": 0.9994527611399714, + "ci95": [ + 0.9816028271992332, + 1.025720850806273 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "calls-recursion-closures", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 6523305.5, + "fixed_batch_median_ns": 6512067.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.016388860533339, + "ci95": [ + 1.0028649452962741, + 1.0364100974363954 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.02040233392665001, + "ci95": [ + 0.01946588161169698, + 0.021751976871423613 + ] + }, + "candidate/interpreter": { + "speed": 1.0125926814475033, + "ci95": [ + 0.9970214558427523, + 1.03693412378113 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "calls-recursion-closures", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 126345.5, + "fixed_batch_median_ns": 127193.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 49.81728385524109, + "ci95": [ + 46.643594973931656, + 52.338725666569665 + ] + }, + "previous/interpreter": { + "speed": 49.01400024110851, + "ci95": [ + 46.01931350326307, + 51.40215907430748 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 49.63121793261264, + "ci95": [ + 47.23753864273149, + 51.4321816618933 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "calls-recursion-closures", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 6474412.5, + "fixed_batch_median_ns": 6467773.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0037489695070767, + "ci95": [ + 0.9729254157787415, + 1.0327154078938077 + ] + }, + "previous/interpreter": { + "speed": 0.9875639221196998, + "ci95": [ + 0.9645982876303821, + 1.0030391908033813 + ] + }, + "previous/bun": { + "speed": 0.020148608912998297, + "ci95": [ + 0.01944135730773122, + 0.021185167129999797 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "json-codec", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 80935811.5, + "fixed_batch_median_ns": 81958329.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9536482930396786, + "ci95": [ + 0.9227928391935336, + 0.9768684588366303 + ] + }, + "previous/bun": { + "speed": 0.09692911355495996, + "ci95": [ + 0.09452726008870793, + 0.09991423740082049 + ] + }, + "candidate/interpreter": { + "speed": 0.9549172967761264, + "ci95": [ + 0.9240492832880144, + 0.9784155298379494 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "json-codec", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 81454534.5, + "fixed_batch_median_ns": 81822138.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0101681779644103, + "ci95": [ + 0.9871692278721266, + 1.0404606619284948 + ] + }, + "previous/interpreter": { + "speed": 0.9633451585987622, + "ci95": [ + 0.9527804874145289, + 0.975765390635178 + ] + }, + "previous/bun": { + "speed": 0.09791470603151932, + "ci95": [ + 0.09497406842910605, + 0.10302203169618426 + ] + }, + "candidate/interpreter": { + "speed": 0.9646270657910396, + "ci95": [ + 0.9534025511848446, + 0.974893785236432 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "json-codec", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 78150901.0, + "fixed_batch_median_ns": 79151383.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.048604613774937, + "ci95": [ + 1.0237324681461575, + 1.0825941816422382 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.1016403156828458, + "ci95": [ + 0.09813851143168249, + 0.10746674659987521 + ] + }, + "candidate/interpreter": { + "speed": 1.0013306831729367, + "ci95": [ + 0.9884675236035945, + 1.0131166705331816 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "json-codec", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 7768216.5, + "fixed_batch_median_ns": 8070507.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 10.316817758092753, + "ci95": [ + 10.006985061112713, + 10.57771512269835 + ] + }, + "previous/interpreter": { + "speed": 9.838615644606602, + "ci95": [ + 9.319779885921937, + 10.194168828501939 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 9.85170772488987, + "ci95": [ + 9.328374702749091, + 10.179755381158355 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "json-codec", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 78587474.5, + "fixed_batch_median_ns": 79666230.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0472111075755737, + "ci95": [ + 1.0224549765881574, + 1.0831129334839449 + ] + }, + "previous/interpreter": { + "speed": 0.998671085191637, + "ci95": [ + 0.9867637086870367, + 1.0115077975781839 + ] + }, + "previous/bun": { + "speed": 0.10150524436220816, + "ci95": [ + 0.09819983978701681, + 0.10733542531186775 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "map-set-bigint", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 17486705.5, + "fixed_batch_median_ns": 17265313.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 1.007968509295038, + "ci95": [ + 1.0021840391408212, + 1.013918352069073 + ] + }, + "previous/bun": { + "speed": 0.04865289485416445, + "ci95": [ + 0.04791191548668257, + 0.0494191971064272 + ] + }, + "candidate/interpreter": { + "speed": 1.0141879825947884, + "ci95": [ + 1.0073481757532177, + 1.0215417349747213 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "map-set-bigint", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 18051910.5, + "fixed_batch_median_ns": 17634379.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9736512124080104, + "ci95": [ + 0.965905873082861, + 0.9823019683945233 + ] + }, + "previous/interpreter": { + "speed": 0.9814097611442086, + "ci95": [ + 0.9764324500132048, + 0.9871805871381076 + ] + }, + "previous/bun": { + "speed": 0.047370950061916675, + "ci95": [ + 0.04675667929159705, + 0.04802422265680087 + ] + }, + "candidate/interpreter": { + "speed": 0.9874653588630499, + "ci95": [ + 0.9800238173216862, + 0.9958152775528171 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "map-set-bigint", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 17619864.5, + "fixed_batch_median_ns": 16841214.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9920944858678065, + "ci95": [ + 0.9862921663317125, + 0.997927826374893 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.04826826870632272, + "ci95": [ + 0.04762385142623391, + 0.04893776667934674 + ] + }, + "candidate/interpreter": { + "speed": 1.0061703051656843, + "ci95": [ + 1.0010219401475542, + 1.0117207116719842 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "map-set-bigint", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 838361.0, + "fixed_batch_median_ns": 911375.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 20.553761559254987, + "ci95": [ + 20.234609748151573, + 20.878683933380536 + ] + }, + "previous/interpreter": { + "speed": 20.717544399287906, + "ci95": [ + 20.43707467890653, + 20.993351130935874 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 20.845377970515123, + "ci95": [ + 20.5073930101422, + 21.18216698248167 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "map-set-bigint", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 17716216.0, + "fixed_batch_median_ns": 17006757.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9860105001850953, + "ci95": [ + 0.9787984928085375, + 0.9926736498470299 + ] + }, + "previous/interpreter": { + "speed": 0.9938675340208253, + "ci95": [ + 0.9885229580892057, + 0.9989788886259301 + ] + }, + "previous/bun": { + "speed": 0.047972265190607544, + "ci95": [ + 0.047235056683369706, + 0.04874817403364573 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "exceptions-promises-async", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2428647.0, + "fixed_batch_median_ns": 2425149.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 0.9540244337684011, + "ci95": [ + 0.9210534483367262, + 0.9765602536737181 + ] + }, + "previous/bun": { + "speed": 0.08363974847247682, + "ci95": [ + 0.08064588998475271, + 0.08542929741431377 + ] + }, + "candidate/interpreter": { + "speed": 0.9533468435549809, + "ci95": [ + 0.9185863064090563, + 0.9753768973537515 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "exceptions-promises-async", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2424448.0, + "fixed_batch_median_ns": 2417905.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0239577869650178, + "ci95": [ + 1.0032314353647904, + 1.059551947871577 + ] + }, + "previous/interpreter": { + "speed": 0.9768807479120463, + "ci95": [ + 0.9710786198530658, + 0.9840484382778506 + ] + }, + "previous/bun": { + "speed": 0.08564357174818811, + "ci95": [ + 0.08513417074610014, + 0.08617051298054994 + ] + }, + "candidate/interpreter": { + "speed": 0.9761869241366434, + "ci95": [ + 0.9699663009925804, + 0.9827358391893964 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "exceptions-promises-async", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2354974.0, + "fixed_batch_median_ns": 2358345.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0481911831649795, + "ci95": [ + 1.02399580913359, + 1.0863082547420422 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.08767044691098677, + "ci95": [ + 0.08698735995004965, + 0.08829504327124073 + ] + }, + "candidate/interpreter": { + "speed": 0.999289755912494, + "ci95": [ + 0.9930682268740828, + 1.005087281477219 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "exceptions-promises-async", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 206870.0, + "fixed_batch_median_ns": 208721.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 11.956037867917168, + "ci95": [ + 11.701267825441818, + 12.394149089655052 + ] + }, + "previous/interpreter": { + "speed": 11.406352257053237, + "ci95": [ + 11.323655549061138, + 11.49710670476824 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 11.398250962802656, + "ci95": [ + 11.32390254272801, + 11.480659496329132 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "exceptions-promises-async", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2351949.0, + "fixed_batch_median_ns": 2355779.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.048936183887757, + "ci95": [ + 1.0251031449058563, + 1.087497731625431 + ] + }, + "previous/interpreter": { + "speed": 1.0007107488927047, + "ci95": [ + 0.9949987042790404, + 1.006910472127599 + ] + }, + "previous/bun": { + "speed": 0.08773275858405168, + "ci95": [ + 0.0871235380608923, + 0.08830366155482582 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "methods-dynamic", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 13191456.0, + "fixed_batch_median_ns": 13026170.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 1.0252355431113174, + "ci95": [ + 1.0054454558834927, + 1.0487422729017566 + ] + }, + "previous/bun": { + "speed": 0.012198812623370098, + "ci95": [ + 0.011504544862664442, + 0.01311150074966134 + ] + }, + "candidate/interpreter": { + "speed": 1.0419573038632235, + "ci95": [ + 1.0189488791269465, + 1.0668766475858955 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "methods-dynamic", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 13390896.5, + "fixed_batch_median_ns": 13198763.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9751582272771271, + "ci95": [ + 0.9552553825895094, + 0.9919186213956895 + ] + }, + "previous/interpreter": { + "speed": 0.9997668747619348, + "ci95": [ + 0.9834444484175496, + 1.0157627827751694 + ] + }, + "previous/bun": { + "speed": 0.011895772492691425, + "ci95": [ + 0.011226521935204764, + 0.012783425414231967 + ] + }, + "candidate/interpreter": { + "speed": 1.0160732373337158, + "ci95": [ + 0.9963055789345718, + 1.0374678774116088 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "methods-dynamic", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 13436113.5, + "fixed_batch_median_ns": 13311053.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9753856142806616, + "ci95": [ + 0.9542593280182241, + 0.9947602423141402 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.01189854634414054, + "ci95": [ + 0.011249032071725477, + 0.012767731739947944 + ] + }, + "candidate/interpreter": { + "speed": 1.0163101648828523, + "ci95": [ + 0.9963742388593775, + 1.0379980037639096 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "methods-dynamic", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 150939.5, + "fixed_batch_median_ns": 151836.5, + "outlier_batches": 6, + "outlier_processes": 5, + "comparisons": { + "previous/automatic": { + "speed": 81.9751914284044, + "ci95": [ + 76.09449615345952, + 86.91234364975433 + ] + }, + "previous/interpreter": { + "speed": 84.04387990575434, + "ci95": [ + 78.27670743878505, + 88.99547667314557 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 85.41464944441188, + "ci95": [ + 79.69244203214498, + 90.60569994954854 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "methods-dynamic", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 13636916.5, + "fixed_batch_median_ns": 13607616.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.9597322234724397, + "ci95": [ + 0.9371025369664162, + 0.9817159853013749 + ] + }, + "previous/interpreter": { + "speed": 0.9839515873731989, + "ci95": [ + 0.9631043842749455, + 1.0036936023125165 + ] + }, + "previous/bun": { + "speed": 0.011707593562750652, + "ci95": [ + 0.01103781435899584, + 0.012533526503801894 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "exceptions-sync", + "variant": "previous", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 620546.5, + "fixed_batch_median_ns": 622860.5, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/interpreter": { + "speed": 4.650433699710415, + "ci95": [ + 4.47382174503688, + 4.756625147144963 + ] + }, + "previous/bun": { + "speed": 0.578511098821757, + "ci95": [ + 0.556036785880085, + 0.5923961336842124 + ] + }, + "candidate/interpreter": { + "speed": 4.65431764926837, + "ci95": [ + 4.470914432967426, + 4.768172946759522 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 20, + 20 + ] + }, + { + "workload": "exceptions-sync", + "variant": "candidate", + "mode": "automatic", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2937162.0, + "fixed_batch_median_ns": 2917101.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.20998112648835326, + "ci95": [ + 0.2005985185846951, + 0.22081824459592925 + ] + }, + "previous/interpreter": { + "speed": 0.9765033069245934, + "ci95": [ + 0.9422076105137125, + 1.0018762267611907 + ] + }, + "previous/bun": { + "speed": 0.12147641221660761, + "ci95": [ + 0.1174220027495198, + 0.12440189038089133 + ] + }, + "candidate/interpreter": { + "speed": 0.9773188630279968, + "ci95": [ + 0.9427345659186976, + 1.0032240544280386 + ] + } + }, + "compilation_quiet_samples": 30, + "native_entry_range": [ + 10, + 10 + ] + }, + { + "workload": "exceptions-sync", + "variant": "previous", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2935859.0, + "fixed_batch_median_ns": 2934873.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.21503370751469275, + "ci95": [ + 0.21028959764177627, + 0.223568961710829 + ] + }, + "previous/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "previous/bun": { + "speed": 0.1243993864180412, + "ci95": [ + 0.12384392862246517, + 0.1250277908653652 + ] + }, + "candidate/interpreter": { + "speed": 1.0008351800732471, + "ci95": [ + 0.9957078805495062, + 1.007269885629605 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "exceptions-sync", + "variant": "previous", + "mode": "bun", + "protocol": "shared-js-multibatch-v3", + "median_ns": 366483.0, + "fixed_batch_median_ns": 369599.5, + "outlier_batches": 2, + "outlier_processes": 2, + "comparisons": { + "previous/automatic": { + "speed": 1.7285753065700586, + "ci95": [ + 1.6876597169798808, + 1.7982135572190663 + ] + }, + "previous/interpreter": { + "speed": 8.038624858160663, + "ci95": [ + 7.998184407973013, + 8.074191483018506 + ] + }, + "previous/bun": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + }, + "candidate/interpreter": { + "speed": 8.045338557458509, + "ci95": [ + 7.991554187863186, + 8.105779956590546 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + }, + { + "workload": "exceptions-sync", + "variant": "candidate", + "mode": "interpreter", + "protocol": "shared-js-multibatch-v3", + "median_ns": 2931548.0, + "fixed_batch_median_ns": 2942333.0, + "outlier_batches": 0, + "outlier_processes": 0, + "comparisons": { + "previous/automatic": { + "speed": 0.21485426551348377, + "ci95": [ + 0.20965443751560026, + 0.22377021622640697 + ] + }, + "previous/interpreter": { + "speed": 0.9991655168704342, + "ci95": [ + 0.9925900245612904, + 1.0041258695548336 + ] + }, + "previous/bun": { + "speed": 0.12429557722874698, + "ci95": [ + 0.12334184118722798, + 0.12512365064939415 + ] + }, + "candidate/interpreter": { + "speed": 1.0, + "ci95": [ + 1.0, + 1.0 + ] + } + }, + "compilation_quiet_samples": 0, + "native_entry_range": null + } +] diff --git a/benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.tar.gz b/benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.tar.gz new file mode 100644 index 00000000..937a1231 Binary files /dev/null and b/benchmarks/results/shell-tiering-8fa2a48-paired-x86_64.tar.gz differ diff --git a/jit/src/config.rs b/jit/src/config.rs index 5a009402..3f508bad 100644 --- a/jit/src/config.rs +++ b/jit/src/config.rs @@ -10,7 +10,15 @@ pub const DEFAULT_MAX_CODE_BYTES: usize = 16 * 1024 * 1024; pub const DEFAULT_MAX_METADATA_BYTES: usize = 16 * 1024 * 1024; pub const DEFAULT_MAX_SNAPSHOT_BYTES: usize = 64 * 1024 * 1024; pub const DEFAULT_MAX_IR_BYTES: usize = 64 * 1024 * 1024; -pub const DEFAULT_COMPILE_TIMEOUT_MS: u64 = 30_000; +/// Per-compile budget. Sanitizer-instrumented test builds run the compiler an +/// order of magnitude slower, where a single Tier 1 compile can exceed the +/// production budget on CI runners and then time out on every retry, so +/// their default budget is ten minutes. +pub const DEFAULT_COMPILE_TIMEOUT_MS: u64 = if cfg!(rquickjs_sanitizer) { + 600_000 +} else { + 30_000 +}; pub const DEFAULT_MAX_QUEUE_LEN: usize = 256; pub const DEFAULT_WORKERS: usize = 1; pub const DEFAULT_MAX_COMPILE_ATTEMPTS: u8 = 4; diff --git a/jit/src/lib.rs b/jit/src/lib.rs index a863769e..55d163ad 100644 --- a/jit/src/lib.rs +++ b/jit/src/lib.rs @@ -863,12 +863,23 @@ struct ProductionBackend { fast_entry: Arc, // C brackets each native invocation with a synchronous enter/exit pair. // Keep active records through retirement and preserve each invocation's tier. - execution_starts: Vec<(runtime::FunctionKey, std::time::Instant, runtime::Tier)>, + // The flag marks an OSR entry, which times only the rest of one call. + execution_starts: Vec<( + runtime::FunctionKey, + std::time::Instant, + runtime::Tier, + bool, + )>, execution_profiles: rustc_hash::FxHashMap, profitability_evaluations: u64, profitability_approved: u64, profitability_rejected: u64, profitability_backoff: std::collections::HashMap, + /// Earliest future `profitability_backoff` retry clock (`u64::MAX` when + /// none). Retries are evaluated by maintenance, so reaching one makes + /// maintenance due; otherwise quiet native code would stretch each short + /// backoff to a full `HOT_MAINTENANCE_INTERVAL`. + next_profitability_retry: u64, /// Baseline was measured harmful and unpublished. This is deliberately /// not a terminal function blacklist: stable feedback may still justify /// one of the coordinator's bounded optimizing-tier trials. @@ -955,6 +966,11 @@ struct ProductionProfile { helper_calls: u64, baseline_executions: u64, baseline_ns: u64, + /// Fastest complete Baseline invocation (entered at its first + /// instruction, not through OSR); zero until one is observed. + /// Preemption only lengthens a sample, so the minimum still shows whether + /// entry cost can dominate the body. + baseline_min_ns: u64, /// Baseline entries not nested in an active execution of the same /// function: `baseline_executions / baseline_outermost` estimates how many /// calls one outside entry performs through self recursion. @@ -969,7 +985,14 @@ struct ProductionProfile { #[cfg(all(feature = "compiler", not(target_family = "wasm")))] impl ProductionProfile { - fn record_baseline(&mut self, elapsed_ns: u64) { + fn record_baseline(&mut self, elapsed_ns: u64, complete: bool) { + if complete { + let elapsed_ns = elapsed_ns.max(1); + self.baseline_min_ns = match self.baseline_min_ns { + 0 => elapsed_ns, + fastest => fastest.min(elapsed_ns), + }; + } self.baseline_executions = self.baseline_executions.saturating_add(1); self.baseline_ns = self.baseline_ns.saturating_add(elapsed_ns); } @@ -1032,6 +1055,112 @@ fn automatic_closure_creation_unprofitable( .any(|instruction| matches!(instruction.opcode().name(), "fclosure" | "fclosure8")) } +/// Opcodes Tier 1 has compiled since roadmap P2, each with the reason +/// automatic tiering rejected it at 0.12.9. Their helper-bridged Baselines +/// are shorter than native entry bookkeeping in host UI code (gpui-shell's +/// panel builder ran 0.8x the interpreter's speed) and settle through extra +/// compiles that delay hot kernels. Until profitability measures the +/// interpreter, automatic tiering keeps such functions interpreted; explicit +/// tier policies and forced test tiers still compile them. +#[cfg(all(feature = "compiler", not(target_family = "wasm")))] +const AUTOMATIC_DEFERRED_TIER1_OPCODES: &[(&str, bytecode::FallbackReason)] = &[ + ("fclosure", bytecode::FallbackReason::UnsupportedOpcode), + ("push_this", bytecode::FallbackReason::ExtendedFrame), + ( + "special_object", + bytecode::FallbackReason::UnsupportedOpcode, + ), + ("dup1", bytecode::FallbackReason::UnsupportedOpcode), + ("dup2", bytecode::FallbackReason::UnsupportedOpcode), + ("perm4", bytecode::FallbackReason::UnsupportedOpcode), + ("swap2", bytecode::FallbackReason::UnsupportedOpcode), + ("rot3l", bytecode::FallbackReason::UnsupportedOpcode), + ("rot3r", bytecode::FallbackReason::UnsupportedOpcode), + ("throw", bytecode::FallbackReason::UnsupportedOpcode), + ("throw_error", bytecode::FallbackReason::UnsupportedOpcode), + ("get_var_undef", bytecode::FallbackReason::UnsupportedOpcode), + ("put_var", bytecode::FallbackReason::UnsupportedOpcode), + ("set_name", bytecode::FallbackReason::ExtendedFrame), + ("get_var_ref", bytecode::FallbackReason::ClosureFrame), + ("put_var_ref", bytecode::FallbackReason::ClosureFrame), + ("set_var_ref", bytecode::FallbackReason::ClosureFrame), + ("get_var_ref_check", bytecode::FallbackReason::ClosureFrame), + ("put_var_ref_check", bytecode::FallbackReason::ClosureFrame), + ("close_loc", bytecode::FallbackReason::UnsupportedOpcode), + ("catch", bytecode::FallbackReason::ExceptionRegion), + ("gosub", bytecode::FallbackReason::ExceptionRegion), + ("ret", bytecode::FallbackReason::ExceptionRegion), + ("nip_catch", bytecode::FallbackReason::ExceptionRegion), + ("to_object", bytecode::FallbackReason::UnsupportedOpcode), + ("to_propkey2", bytecode::FallbackReason::UnsupportedOpcode), + ("for_in_start", bytecode::FallbackReason::UnsupportedOpcode), + ("for_of_start", bytecode::FallbackReason::UnsupportedOpcode), + ("for_in_next", bytecode::FallbackReason::UnsupportedOpcode), + ("for_of_next", bytecode::FallbackReason::UnsupportedOpcode), + ( + "iterator_close", + bytecode::FallbackReason::UnsupportedOpcode, + ), + ("typeof", bytecode::FallbackReason::UnsupportedOpcode), + ("delete", bytecode::FallbackReason::UnsupportedOpcode), + ("delete_var", bytecode::FallbackReason::UnsupportedOpcode), + ("pow", bytecode::FallbackReason::UnsupportedOpcode), + ("instanceof", bytecode::FallbackReason::UnsupportedOpcode), + ("in", bytecode::FallbackReason::UnsupportedOpcode), + ("fclosure8", bytecode::FallbackReason::UnsupportedOpcode), + ("get_var_ref0", bytecode::FallbackReason::ClosureFrame), + ("get_var_ref1", bytecode::FallbackReason::ClosureFrame), + ("get_var_ref2", bytecode::FallbackReason::ClosureFrame), + ("get_var_ref3", bytecode::FallbackReason::ClosureFrame), + ("put_var_ref0", bytecode::FallbackReason::ClosureFrame), + ("put_var_ref1", bytecode::FallbackReason::ClosureFrame), + ("put_var_ref2", bytecode::FallbackReason::ClosureFrame), + ("put_var_ref3", bytecode::FallbackReason::ClosureFrame), + ("set_var_ref0", bytecode::FallbackReason::ClosureFrame), + ("set_var_ref1", bytecode::FallbackReason::ClosureFrame), + ("set_var_ref2", bytecode::FallbackReason::ClosureFrame), + ("set_var_ref3", bytecode::FallbackReason::ClosureFrame), + ( + "typeof_is_undefined", + bytecode::FallbackReason::UnsupportedOpcode, + ), + ( + "typeof_is_function", + bytecode::FallbackReason::UnsupportedOpcode, + ), +]; + +#[cfg(all(feature = "compiler", not(target_family = "wasm")))] +fn automatic_deferred_tier1_rejection( + config: &JitConfig, + verified: &bytecode::VerifiedFunction, +) -> Option { + #[cfg(feature = "test-support")] + if config.force_optimized() { + return None; + } + if config.tier_policy() != JitTierPolicy::Automatic { + return None; + } + verified.instructions().iter().find_map(|instruction| { + let name = instruction.opcode().name(); + AUTOMATIC_DEFERRED_TIER1_OPCODES + .iter() + .find(|(deferred, _)| *deferred == name) + .map(|(_, reason)| *reason) + }) +} + +/// Fastest Baseline execution below which exhausted Tier2 profitability +/// retries still return a function to the interpreter. Native entry and exit +/// bookkeeping (including two `Instant` reads) costs a fraction of a +/// microsecond, so it can outweigh a body as short as `return a + b` (about +/// 0.5 us per Baseline execution, bookkeeping included). A Baseline that runs +/// for longer cannot lose to the interpreter through entry cost; it keeps +/// running while its bounded Tier2 trial waits for the compile queue. +#[cfg(all(feature = "compiler", not(target_family = "wasm")))] +const ENTRY_DOMINATED_BASELINE_NS: u64 = 10_000; + /// Minimum observed self-recursive calls per outside entry before a pure /// recursive function is admitted to the native-call convention. #[cfg(all(feature = "compiler", not(target_family = "wasm")))] @@ -1754,7 +1883,7 @@ mod production_osr_validation_tests { fn tier2_profitability_trial_is_classified_exactly_once() { let mut profile = ProductionProfile::default(); for _ in 0..8 { - profile.record_baseline(100); + profile.record_baseline(100, true); } for _ in 0..7 { profile.record_optimized(80); @@ -1771,7 +1900,7 @@ mod production_osr_validation_tests { let mut slow = ProductionProfile::default(); for _ in 0..8 { - slow.record_baseline(100); + slow.record_baseline(100, true); } for _ in 0..8 { slow.record_optimized(125); @@ -1787,7 +1916,7 @@ mod production_osr_validation_tests { // not condemn a Tier-2 version whose steady state is faster. let mut profile = ProductionProfile::default(); for _ in 0..8 { - profile.record_baseline(600); + profile.record_baseline(600, true); } for _ in 0..7 { profile.record_optimized(400); @@ -2392,6 +2521,7 @@ impl ProductionBackend { profitability_approved: 0, profitability_rejected: 0, profitability_backoff: std::collections::HashMap::new(), + next_profitability_retry: u64::MAX, profitability_blacklisted: rustc_hash::FxHashSet::default(), tier2_untranslatable: rustc_hash::FxHashSet::default(), native_recursive: rustc_hash::FxHashSet::default(), @@ -2439,9 +2569,20 @@ impl ProductionBackend { let due = self.hot_ticks_since_maintenance >= HOT_MAINTENANCE_INTERVAL || self.coordinator.has_pending_work() || self.feedback.version() != self.last_scan_feedback_version - || self.coordinator.installed_count() != self.last_scan_installed; + || self.coordinator.installed_count() != self.last_scan_installed + || self.clock >= self.next_profitability_retry; if due { self.maintenance(); + // Only future retries can make the next maintenance due; one the + // scan did not reach waits for ordinary maintenance. + let clock = self.clock; + self.next_profitability_retry = self + .profitability_backoff + .values() + .map(|&(_, retry_at)| retry_at) + .filter(|&retry_at| retry_at > clock) + .min() + .unwrap_or(u64::MAX); } else { self.clock = self.clock.saturating_add(1); self.coordinator.advance_clock(self.clock); @@ -2568,9 +2709,9 @@ impl ProductionBackend { self.optimizing_snapshots.remove(&key); self.feedback_disabled.insert(key); self.tier2_untranslatable.insert(key); - if self.profitability_blacklisted.insert(key) { - self.coordinator.demote_baseline_to_interpreter(key); - } + // A Baseline retained for a Tier2 trial is demoted here too. + self.profitability_blacklisted.insert(key); + self.coordinator.demote_baseline_to_interpreter(key); } fn maintenance(&mut self) { @@ -3017,10 +3158,9 @@ impl ProductionBackend { self.generic_call_rejections = self.generic_call_rejections.saturating_add(1); self.optimizing_snapshots.remove(&key); self.feedback_disabled.insert(key); - if !self.profitability_blacklisted.contains(&key) { - self.profitability_blacklisted.insert(key); - self.coordinator.demote_baseline_to_interpreter(key); - } + // A Baseline retained for a Tier2 trial is demoted here too. + self.profitability_blacklisted.insert(key); + self.coordinator.demote_baseline_to_interpreter(key); continue; } let numeric_candidate = snapshot.instructions().iter().any(|instruction| { @@ -3166,10 +3306,26 @@ impl ProductionBackend { .or_insert((0, self.clock)); entry.0 = entry.0.saturating_add(1); if entry.0 >= 5 { + // Queue the funded trial at the next maintenance + // instead of the next periodic one. + entry.1 = self.clock.saturating_add(1); + self.next_profitability_retry = self.next_profitability_retry.min(entry.1); + // Exhausted retries fund one bounded Tier2 trial + // (below, through the blacklist). Only a Baseline + // whose entry cost can dominate its body goes back to + // the interpreter meanwhile; demoting a long-running + // one would stall it until the queued trial installs. self.profitability_blacklisted.insert(key); - self.coordinator.demote_baseline_to_interpreter(key); + // No complete execution yet: keep the conservative + // demotion. + if measured.baseline_min_ns == 0 + || measured.baseline_min_ns < ENTRY_DOMINATED_BASELINE_NS + { + self.coordinator.demote_baseline_to_interpreter(key); + } } else { entry.1 = self.clock.saturating_add(1u64 << entry.0.min(20)); + self.next_profitability_retry = self.next_profitability_retry.min(entry.1); } continue; } @@ -3229,6 +3385,18 @@ impl ProductionBackend { { self.optimizing_snapshots.insert(key, snapshot); } else { + // A trial funded by exhausted retries while its + // long-running Baseline was retained: the function is + // proven hot and slow, so compile it ahead of first + // Baselines queued by other functions. + if self.profitability_blacklisted.contains(&key) + && matches!( + self.coordinator.tier_state(key, runtime::Tier::Baseline), + runtime::CompileState::Installed(_) + ) + { + self.coordinator.prioritize(key, runtime::Tier::Optimizing); + } self.tier2_deferred.remove(&key); self.tier2_sources.insert(key, snapshot); } @@ -3711,6 +3879,14 @@ unsafe impl rquickjs_core::runtime::JitBackend for ProductionBackend { self.maintenance(); return; } + if let Some(reason) = automatic_deferred_tier1_rejection(&self.config, &verified) { + self.coordinator + .reject_tier1(key, runtime::Tier::Baseline, reason); + self.feedback_disabled.insert(key); + self.clear_failed_request(key); + self.maintenance(); + return; + } self.ensure_artifact_environment(); let adaptive = runtime::AdaptiveInputs { bytecode_bytes: verified @@ -3815,11 +3991,17 @@ unsafe impl rquickjs_core::runtime::JitBackend for ProductionBackend { // Profitability-demoted functions have no publishable native entry. // Avoid running global maintenance at every subsequent call/OSR probe; // this keeps the fail-open interpreter path close to unattached cost. + // A blacklisted function whose long-running Baseline was retained for + // its Tier2 trial still enters that Baseline. if self.profitability_blacklisted.contains(&key) && !matches!( self.coordinator.tier_state(key, runtime::Tier::Optimizing), runtime::CompileState::Installed(_) ) + && !matches!( + self.coordinator.tier_state(key, runtime::Tier::Baseline), + runtime::CompileState::Installed(_) + ) { return empty; } @@ -3947,14 +4129,14 @@ unsafe impl rquickjs_core::runtime::JitBackend for ProductionBackend { && self .execution_starts .last() - .is_none_or(|(parent, _, _)| *parent != key) + .is_none_or(|(parent, _, _, _)| *parent != key) { if let Some(profile) = self.execution_profiles.get_mut(&key) { profile.baseline_outermost = profile.baseline_outermost.saturating_add(1); } } self.execution_starts - .push((key, std::time::Instant::now(), tier)); + .push((key, std::time::Instant::now(), tier, pc != 0)); } fn entry_fast_grant( @@ -3998,11 +4180,11 @@ unsafe impl rquickjs_core::runtime::JitBackend for ProductionBackend { // An unmatched callback must not discard a different active timer. // Actual C invocations, including recursive and OSR entries, are LIFO. let mut measured_tier2_loss = false; - if let Some((_, start, tier)) = self + if let Some((_, start, tier, osr)) = self .execution_starts .last() .copied() - .filter(|(active, _, _)| !unpaired && *active == key) + .filter(|(active, _, _, _)| !unpaired && *active == key) { self.execution_starts.pop(); let elapsed = start.elapsed().as_nanos().try_into().unwrap_or(u64::MAX); @@ -4024,6 +4206,12 @@ unsafe impl rquickjs_core::runtime::JitBackend for ProductionBackend { // function identity. The coordinator only acts on a loss when // that baseline is still installed to fall back to. measured_tier2_loss = classify_tier2_trial(profile) == Some(true); + // A forced test tier must stay optimized: under sanitizer or + // loaded hosts, timing noise alone can classify a loss. + #[cfg(feature = "test-support")] + if self.config.force_optimized() { + measured_tier2_loss = false; + } if exit_kind == rquickjs_core::qjs::JSJitExitKind_JS_JIT_EXIT_DONE { if let Some(baseline_average) = profile.baseline_ns.checked_div(profile.baseline_executions) @@ -4043,7 +4231,7 @@ unsafe impl rquickjs_core::runtime::JitBackend for ProductionBackend { } } } else { - profile.record_baseline(elapsed); + profile.record_baseline(elapsed, !osr); } } if measured_tier2_loss && self.coordinator.demote_unprofitable_optimized(key) { diff --git a/jit/src/runtime/background.rs b/jit/src/runtime/background.rs index 09dd9494..a3f4c41b 100644 --- a/jit/src/runtime/background.rs +++ b/jit/src/runtime/background.rs @@ -30,6 +30,10 @@ pub struct BackgroundCompiler { max_snapshot_bytes: usize, max_ir_bytes: usize, overflow: Arc>>, + /// Jobs handed to the channel never exceed the workers that can run them: + /// the backlog stays in the coordinator queue, where a Tier2 request can + /// still be taken ahead of first Baseline compiles. + worker_count: usize, } struct WorkerStartup { @@ -111,6 +115,7 @@ impl BackgroundCompiler { max_snapshot_bytes, max_ir_bytes, overflow, + worker_count, }) } @@ -204,6 +209,9 @@ impl BackgroundCompiler { if self.sender.is_none() { return Err(BackgroundCompilerError::Shutdown); } + if self.usage.jobs.load(Ordering::Acquire) >= self.worker_count { + return Ok(false); + } *self .completion_slot .lock() @@ -359,6 +367,42 @@ mod tests { assert_eq!(coordinator.metrics().queued, 0); } + struct BlockingCompiler(std::sync::Mutex>); + + impl Compiler for BlockingCompiler { + fn compile(&self, request: CompileRequest) -> Result { + let _ = self.0.lock().unwrap().recv(); + Ok(CompiledArtifact::fake(request.tier())) + } + } + + #[test] + fn dispatch_keeps_the_backlog_in_the_coordinator_while_workers_are_busy() { + let (release, blocked) = std::sync::mpsc::channel(); + let mut background = BackgroundCompiler::new( + Arc::new(BlockingCompiler(std::sync::Mutex::new(blocked))), + 1, + 8, + ) + .unwrap(); + let mut coordinator = Coordinator::with_limits(8, 8, 4, 1 << 20); + for id in 1..=3 { + coordinator + .queue(FunctionKey::new(id, 1), Tier::Baseline, snapshot()) + .unwrap(); + } + + assert!(background.dispatch_next(&mut coordinator).unwrap()); + // The single worker is busy: later requests stay reorderable. + assert!(!background.dispatch_next(&mut coordinator).unwrap()); + assert_eq!(coordinator.metrics().compiling, 1); + + for _ in 0..3 { + release.send(()).unwrap(); + } + background.shutdown(&mut coordinator); + } + #[test] fn first_queued_request_starts_the_configured_workers() { let mut background = BackgroundCompiler::new(Arc::new(ImmediateCompiler), 2, 1).unwrap(); diff --git a/jit/src/runtime/coordinator.rs b/jit/src/runtime/coordinator.rs index 079ab02f..407e4d4e 100644 --- a/jit/src/runtime/coordinator.rs +++ b/jit/src/runtime/coordinator.rs @@ -1686,6 +1686,22 @@ impl Coordinator { Ok(()) } + /// Moves a queued request to the front of the compile queue. Returns + /// false when no such request is waiting. + pub fn prioritize(&mut self, key: FunctionKey, tier: Tier) -> bool { + let Some(index) = self + .queue + .iter() + .position(|request| request.key == key && request.tier == tier) + else { + return false; + }; + if let Some(request) = self.queue.remove(index) { + self.queue.push_front(request); + } + true + } + pub fn begin_next(&mut self) -> Option { loop { let request = self.queue.pop_front()?; @@ -2598,7 +2614,6 @@ impl Coordinator { self.cache.collect_invalidated(); } } - #[cfg(test)] mod tests { use std::sync::Arc; @@ -3173,6 +3188,49 @@ mod tests { ); } + #[test] + fn prioritized_request_is_taken_ahead_of_earlier_requests() { + let mut coordinator = Coordinator::with_limits(4, 4, 4, 1 << 20); + let first = FunctionKey::new(1, 1); + let second = FunctionKey::new(2, 1); + let kernel = FunctionKey::new(3, 1); + // Tier2 requires an installed Baseline. + coordinator + .queue(kernel, Tier::Baseline, snapshot()) + .unwrap(); + let request = coordinator.begin_next().unwrap(); + coordinator.complete(CompileCompletion { + key: kernel, + requested_tier: Tier::Baseline, + artifact_key: request.artifact_key(), + attempt_id: request.attempt_id(), + result: Ok(CompiledArtifact::fake(Tier::Baseline).bind_fake(request.artifact_key())), + }); + coordinator + .queue(first, Tier::Baseline, snapshot()) + .unwrap(); + coordinator + .queue(second, Tier::Baseline, snapshot()) + .unwrap(); + coordinator + .queue(kernel, Tier::Optimizing, snapshot()) + .unwrap(); + assert!(coordinator.prioritize(kernel, Tier::Optimizing)); + assert!(!coordinator.prioritize(FunctionKey::new(9, 1), Tier::Optimizing)); + + let order: Vec<_> = std::iter::from_fn(|| coordinator.begin_next()) + .map(|request| (request.key(), request.tier())) + .collect(); + assert_eq!( + order, + [ + (kernel, Tier::Optimizing), + (first, Tier::Baseline), + (second, Tier::Baseline), + ] + ); + } + #[test] fn measured_tier2_loss_only_demotes_onto_an_installed_baseline() { fn install(coordinator: &mut Coordinator, key: FunctionKey, tier: Tier) { diff --git a/jit/tests/array_bce.rs b/jit/tests/array_bce.rs index 066965a2..ebf4a2c2 100644 --- a/jit/tests/array_bce.rs +++ b/jit/tests/array_bce.rs @@ -37,7 +37,8 @@ fn prepared(source: &str, warmup: &str) -> (Runtime, Jit, Context) { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(source)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); context.with(|ctx| ctx.eval::<(), _>(warmup)).unwrap(); diff --git a/jit/tests/array_semantics.rs b/jit/tests/array_semantics.rs index a7299c11..f346c613 100644 --- a/jit/tests/array_semantics.rs +++ b/jit/tests/array_semantics.rs @@ -66,7 +66,8 @@ fn prepared_length_reader(definition: &str) -> (Runtime, Jit, Context) { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(definition)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); assert_eq!( @@ -349,7 +350,8 @@ fn prepared_typed_store(source: &str, warmup: &str) -> (Runtime, Jit, Context) { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(source)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); context.with(|ctx| ctx.eval::<(), _>(warmup)).unwrap(); @@ -522,7 +524,8 @@ fn packed_hoist_edge_cases_match_the_same_version_interpreter() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(SOURCE)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); assert_eq!( @@ -596,7 +599,8 @@ fn stale_bound_writes_and_reentry_match_the_same_version_interpreter() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(SOURCE)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let mut entered_tier2 = false; while Instant::now() < deadline { let before = jit.metrics(); @@ -667,7 +671,8 @@ fn detached_and_resizable_views_match_the_same_version_interpreter() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(SOURCE)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let mut entered_tier2 = false; while Instant::now() < deadline { let before = jit.metrics(); diff --git a/jit/tests/background.rs b/jit/tests/background.rs index f095e443..d332f6ca 100644 --- a/jit/tests/background.rs +++ b/jit/tests/background.rs @@ -37,7 +37,8 @@ fn foreground_submission_never_waits_for_blocked_compiler() { assert_eq!(coordinator.drain_completions().drained(), 0); control.complete(CompiledArtifact::fake(Tier::Baseline)); - let deadline = Instant::now() + std::time::Duration::from_secs(5); + let deadline = Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while workers.live_usage().0 != 0 && Instant::now() < deadline { std::thread::yield_now(); } @@ -102,7 +103,7 @@ fn stale_completion_after_reload_is_discarded() { } #[test] -fn saturated_worker_mailbox_rolls_request_back_to_queue() { +fn busy_workers_leave_backlog_queued_without_saturating_the_mailbox() { let (compiler, control) = FakeCompiler::new(2); let mut workers = BackgroundCompiler::new(Arc::new(compiler), 1, 1).unwrap(); let mut coordinator = Coordinator::with_limits(3, 3, 4, 1024); @@ -113,12 +114,24 @@ fn saturated_worker_mailbox_rolls_request_back_to_queue() { } assert!(workers.dispatch_next(&mut coordinator).unwrap()); let _first = control.next_request().unwrap(); - assert!(workers.dispatch_next(&mut coordinator).unwrap()); + // The only worker is busy: the backlog stays in the coordinator queue, + // where a later Tier2 request can still overtake it. assert!(!workers.dispatch_next(&mut coordinator).unwrap()); - assert_eq!(coordinator.metrics().worker_queue_saturated, 1); + assert_eq!(coordinator.metrics().worker_queue_saturated, 0); + assert_eq!( + coordinator.state(FunctionKey::new(2, 1)), + CompileState::Queued(Tier::Baseline) + ); control.complete(CompiledArtifact::fake(Tier::Baseline)); - let _ = control.next_request().unwrap(); + while workers.live_usage().0 != 0 { + std::thread::yield_now(); + } + assert!(workers.dispatch_next(&mut coordinator).unwrap()); + assert_eq!( + control.next_request().unwrap().key(), + FunctionKey::new(2, 1) + ); control.complete(CompiledArtifact::fake(Tier::Baseline)); workers.shutdown(&mut coordinator); assert_eq!( @@ -150,11 +163,17 @@ fn saturated_completion_mailbox_does_not_deadlock_shutdown() { coordinator .queue(FunctionKey::new(id, 1), Tier::Baseline, snapshot(id, 1)) .unwrap(); - workers.dispatch_next(&mut coordinator).unwrap(); + // Dispatch waits for an idle worker; the previous job may still be + // releasing its usage after the fake compiler returned. + while workers.live_usage().0 != 0 { + std::thread::yield_now(); + } + assert!(workers.dispatch_next(&mut coordinator).unwrap()); assert!(control.next_request().is_some()); control.complete(CompiledArtifact::fake(Tier::Baseline)); } - let deadline = Instant::now() + std::time::Duration::from_secs(5); + let deadline = Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while coordinator.metrics().completion_queue_saturated == 0 && Instant::now() < deadline { std::thread::yield_now(); } @@ -222,7 +241,8 @@ fn production_backend_receives_owned_snapshots_automatically() { .unwrap(); assert_eq!(value, 42); }); - let deadline = Instant::now() + std::time::Duration::from_secs(5); + let deadline = Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while Instant::now() < deadline { jit.poll(); if jit.metrics().installed >= 1 { @@ -321,7 +341,8 @@ fn two_production_runtimes_compile_install_execute_and_retire_independently() { let environment_a = jit_a.test_artifact_environment(); let environment_b = jit_b.test_artifact_environment(); assert_ne!(environment_a.runtime_id, environment_b.runtime_id); - let deadline = Instant::now() + std::time::Duration::from_secs(10); + let deadline = Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while Instant::now() < deadline && (jit_a.metrics().installed == 0 || jit_b.metrics().installed == 0) { @@ -411,7 +432,8 @@ fn pending_job_poll_installs_without_an_additional_eligible_function_call() { ) .unwrap(); }); - let deadline = Instant::now() + std::time::Duration::from_secs(5); + let deadline = Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while Instant::now() < deadline && jit.metrics().installed == 0 { let _ = runtime.execute_pending_job(); std::thread::yield_now(); @@ -495,9 +517,11 @@ fn snapshot_quota_falls_back_without_disabling_runtime() { fn pending_snapshot_and_ir_quotas_are_total_and_release_via_raii() { let (compiler, control) = FakeCompiler::new(1); let bytes = snapshot(1, 1).snapshot().owned_bytes(); + // Two workers, so the second request is dispatchable while the first is + // pending and reaches the total quota check. let mut workers = BackgroundCompiler::new_with_resource_limits( Arc::new(compiler), - 1, + 2, 2, std::time::Duration::from_secs(30), bytes, diff --git a/jit/tests/call_guard_licm.rs b/jit/tests/call_guard_licm.rs index 7b286ccb..37321105 100644 --- a/jit/tests/call_guard_licm.rs +++ b/jit/tests/call_guard_licm.rs @@ -84,7 +84,8 @@ impl NativeLoop { } fn ready(&self, expression: &str, expected: f64) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = self.jit.metrics(); let calls = self.count(rquickjs_core::qjs::JSJitHelperId_JS_JIT_HELPER_CALL); @@ -119,7 +120,8 @@ impl NativeLoop { } fn ready_with_call_fallback(&self, warm: &str, expected: f64, zero_trip: &str) -> bool { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { assert_eq!(self.number(warm), expected); self.jit.poll(); diff --git a/jit/tests/fast_entry.rs b/jit/tests/fast_entry.rs index 2144af70..42f102e4 100644 --- a/jit/tests/fast_entry.rs +++ b/jit/tests/fast_entry.rs @@ -27,8 +27,13 @@ struct Calls { } /// Leaked for the process lifetime so native code can reach it without a pin. +/// Each allocation stays registered so LeakSanitizer still finds it reachable +/// once the test that created it has returned. fn calls() -> &'static Calls { - Box::leak(Box::default()) + static LEAKED: Mutex> = Mutex::new(Vec::new()); + let calls: &'static Calls = Box::leak(Box::default()); + LEAKED.lock().unwrap().push(calls); + calls } struct Pin { diff --git a/jit/tests/frame_inline.rs b/jit/tests/frame_inline.rs index 5c5ad2b6..6bb5c001 100644 --- a/jit/tests/frame_inline.rs +++ b/jit/tests/frame_inline.rs @@ -87,7 +87,8 @@ impl FrameInline { } fn wait_for_tier2(&self, expression: &str, expected: f64) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { assert_eq!(self.number(expression), expected, "{expression}"); self.jit.poll(); @@ -105,6 +106,33 @@ impl FrameInline { } } + /// Like `wait_for_tier2`, but also waits until the Tier2 body makes no + /// generic CALL: a slow host can enter a first caller artifact compiled + /// before its callee's edge was ready. + fn wait_for_linked_tier2(&self, expression: &str, expected: f64) { + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); + loop { + assert_eq!(self.number(expression), expected, "{expression}"); + self.jit.poll(); + let before = self.jit.metrics(); + let calls = self.count(qjs::JSJitHelperId_JS_JIT_HELPER_CALL); + assert_eq!(self.number(expression), expected, "{expression}"); + let after = self.jit.metrics(); + if after.tier2_entries == before.tier2_entries + 1 + && self.count(qjs::JSJitHelperId_JS_JIT_HELPER_CALL) == calls + && after.pending_worker_jobs == 0 + { + return; + } + assert!( + Instant::now() < deadline, + "linked Tier2 was not installed: {after:?}" + ); + std::thread::sleep(Duration::from_millis(1)); + } + } + fn wait_for_caller_tier2( &self, callee_name: &str, @@ -112,7 +140,8 @@ impl FrameInline { input: &str, expected: f64, ) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { assert_eq!( self.caller_number(callee_name, object_name, input), @@ -148,7 +177,8 @@ impl FrameInline { input: i32, expected: f64, ) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { self.jit.poll(); let before = self.jit.metrics(); @@ -169,7 +199,8 @@ impl FrameInline { } fn wait_for_compiled_artifact(&self, expression: &str, expected: f64) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let installed = self.jit.metrics().installed; loop { assert_eq!(self.number(expression), expected, "{expression}"); @@ -188,7 +219,8 @@ impl FrameInline { fn wait_for_native_nested_plain_caller(&self) { let expression = "caller(nestedOuter,plain,7)"; - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { self.jit.poll(); let before = self.jit.metrics(); @@ -353,7 +385,7 @@ fn duplicated_frame_inline_result_preserves_owners_through_gc_and_deopt() { "#, ); test.wait_for_tier2("effect(state,7)", 7.0); - test.wait_for_tier2("caller(effect,state,7)", 7.0); + test.wait_for_linked_tier2("caller(effect,state,7)", 7.0); let warmed = test.jit.metrics(); assert_eq!(warmed.compile_failures, 0, "stress={stress}: {warmed:?}"); let calls = test.count(qjs::JSJitHelperId_JS_JIT_HELPER_CALL); diff --git a/jit/tests/generic_call_cleanup.rs b/jit/tests/generic_call_cleanup.rs index f128dbb3..7a45831d 100644 --- a/jit/tests/generic_call_cleanup.rs +++ b/jit/tests/generic_call_cleanup.rs @@ -66,7 +66,8 @@ fn exercise_cleanup(force_tier2: bool, stress_gc: bool) { ctx.eval::<(), _>("globalThis.state={hits:0};function caller(f,x,enabled,o){let result=f(x,enabled,o);return result;}").unwrap(); }); let invoke = || context.with(|ctx| ctx.eval::("caller(effect,17,true,state)").unwrap()); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); assert_eq!(invoke(), 17); @@ -271,7 +272,8 @@ fn tier2_generic_call_preserves_primitive_live_prefix() { caller.call::<_, i32>((effect, 41)).unwrap() }) }; - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics().tier2_entries; assert_eq!(invoke(), 42); diff --git a/jit/tests/inline_refcount.rs b/jit/tests/inline_refcount.rs index 5f9ca3af..e1f5c3be 100644 --- a/jit/tests/inline_refcount.rs +++ b/jit/tests/inline_refcount.rs @@ -278,7 +278,8 @@ fn helpers_run_only_for_last_references_or_stress() { }; let call = |source: &str| context.with(|ctx| ctx.eval::(source).catch(&ctx).unwrap()); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(60); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics().native_entries; assert_eq!(call("sharedOnly(64)"), 64); diff --git a/jit/tests/mixed_direct_calls.rs b/jit/tests/mixed_direct_calls.rs index ac81409a..33d16369 100644 --- a/jit/tests/mixed_direct_calls.rs +++ b/jit/tests/mixed_direct_calls.rs @@ -110,7 +110,8 @@ fn exercise_mixed_edge( caller.call::<_, i32>((leaf, 7, enabled, 128)).unwrap() }) }; - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); // The timed Tier-2 profitability trial needs eight optimized caller // executions and may demote the caller once it decides, which briefly // reroutes the edge through generic CALL until the replacement installs. diff --git a/jit/tests/native_calls.rs b/jit/tests/native_calls.rs index 892801c4..344a9ad7 100644 --- a/jit/tests/native_calls.rs +++ b/jit/tests/native_calls.rs @@ -102,7 +102,8 @@ impl Harness { /// wrapper with an exception region, which Tier 2 leaves on Tier 1): they /// enter the recursion's root, and every recursive call is still native. fn warm_native_from(&self, expression: &str, expected: &str, outside_calls: u64) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let calls = generic_calls(&self.context); let before = self.jit.metrics(); @@ -409,7 +410,8 @@ fn monomorphic_callers_link_to_a_published_native_entry() { let harness = Harness::new(&source, force); // Publish the callee's native entry before the caller's Tier 2. harness.warm_native("fib(15)", "610"); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let calls = generic_calls(&harness.context); let before = harness.jit.metrics(); @@ -455,7 +457,8 @@ fn shallow_recursion_stays_out_of_native_code() { function drive(k){let s=0;for(let i=0;i("function target(a,b,c,d){return ((a+b)*(c+d))+((a+b)*(c+d))}") }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -2003,7 +2004,8 @@ fn production_feedback_installs_and_executes_the_int32_add_specialization() { context .with(|ctx| ctx.eval::<(), _>("function add(a,b){return a+b}")) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while std::time::Instant::now() < deadline { assert_eq!( context.with(|ctx| { @@ -2190,7 +2192,8 @@ fn production_tier2_waits_for_and_calls_a_direct_callee() { ) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(15); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 75 } else { 15 }); while std::time::Instant::now() < deadline { assert_eq!( context.with(|ctx| { @@ -2259,7 +2262,8 @@ fn production_tier2_direct_call_checks_object_before_payload() { }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(60); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while std::time::Instant::now() < deadline { assert_eq!( context @@ -2348,7 +2352,8 @@ fn production_unboxed_call_deopts_exactly_on_target_type_and_overflow_mismatch() // Background compilation is much slower under coverage or sanitizer // instrumentation; let every queued caller version land before the // deoptimization probes run. - let settled = std::time::Instant::now() + std::time::Duration::from_secs(60); + let settled = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while std::time::Instant::now() < settled { let metrics = jit.metrics(); if metrics.pending_worker_jobs == 0 @@ -2420,7 +2425,8 @@ fn production_worker_installs_and_enters_narrow_tier2_native_code() { function.call::<_, f64>((50_000, 0)).unwrap() }); assert_eq!(first, 1_249_975_000.0); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while std::time::Instant::now() < deadline { let last = context.with(|ctx| { let function: Function<'_> = ctx.globals().get("f").unwrap(); @@ -2490,7 +2496,8 @@ fn stable_int32_loop_waits_for_and_installs_a_bounded_raw_i32_version() { }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(60); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while std::time::Instant::now() < deadline { let metrics = jit.metrics(); if metrics.tier2_entries >= 10 @@ -2600,6 +2607,10 @@ fn iterative_fibonacci_enters_tier2_with_multi_local_loop_phis() { any(target_arch = "x86_64", target_arch = "aarch64") ))] #[test] +#[cfg_attr( + rquickjs_sanitizer, + ignore = "absolute-time heuristic: instrumentation slows entry bookkeeping but not generated code" +)] fn automatic_profitability_blacklist_unpublishes_harmful_baseline() { use rquickjs::{Context, Function, Runtime}; use rquickjs_jit::{Jit, JitConfig}; @@ -2658,7 +2669,76 @@ fn automatic_profitability_blacklist_unpublishes_harmful_baseline() { any(target_arch = "x86_64", target_arch = "aarch64") ))] #[test] -fn automatic_gpui_layout_kernel_enters_tier2_after_harmful_baseline_demotion() { +fn automatic_layout_kernel_reaches_tier2_without_host_polling() { + use rquickjs::{Context, Function, Runtime}; + use rquickjs_jit::{Jit, JitConfig}; + + // gpui-shell never calls `Jit::poll`: maintenance runs only when hot + // probes find it due. Profitability retries must still follow their + // short backoff instead of waiting a full periodic interval each. + let runtime = Runtime::new().unwrap(); + let jit = Jit::attach(&runtime, JitConfig::default()).unwrap(); + let context = Context::full(&runtime).unwrap(); + context + .with(|ctx| { + ctx.eval::<(), _>( + "function layoutKernel(batches,seed){\ + let checksum=seed;\ + for(let batch=0;batch((100, 0)).unwrap(), 165_580_141); + }); + }; + // Background compilation is far slower under sanitizer or coverage + // instrumentation; bound the waits by time rather than by iterations. + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 600 } else { 120 }); + while jit.metrics().native_entries == 0 { + assert!(std::time::Instant::now() < deadline, "{:?}", jit.metrics()); + call(); + std::thread::sleep(std::time::Duration::from_micros(200)); + } + // Queueing happens on this thread, so the call count is deterministic; + // the compile itself is timed by the (possibly contended) worker. + let mut calls = 0; + while jit.metrics().queued < 2 { + assert!(std::time::Instant::now() < deadline, "{:?}", jit.metrics()); + call(); + calls += 1; + } + assert!( + calls <= 60, + "the Tier2 trial was queued {calls} calls after the Baseline without host polling: {:?}", + jit.metrics() + ); + while jit.metrics().tier2_entries == 0 { + assert!(std::time::Instant::now() < deadline, "{:?}", jit.metrics()); + call(); + // Give the worker time to compile between calls, as frames do. + std::thread::sleep(std::time::Duration::from_micros(500)); + } + let metrics = jit.metrics(); + assert_eq!(metrics.interpreter_demotions, 0, "{metrics:?}"); +} + +#[cfg(all( + any(target_os = "linux", target_os = "macos"), + target_endian = "little", + any(target_arch = "x86_64", target_arch = "aarch64") +))] +#[test] +fn automatic_gpui_layout_kernel_keeps_baseline_until_tier2_trial() { use rquickjs::{Context, Function, Runtime}; use rquickjs_jit::{Jit, JitConfig}; @@ -2690,10 +2770,16 @@ fn automatic_gpui_layout_kernel_enters_tier2_after_harmful_baseline_demotion() { }) .unwrap(); - let mut saw_demotion = false; + // Each call runs for tens of microseconds, so native entry bookkeeping + // cannot make its Baseline slower than the interpreter. Exhausting the + // Tier2 profitability retries must fund the bounded trial while the + // Baseline keeps running; returning to the interpreter would stall the + // kernel for as long as the trial waits in the compile queue. + let mut native_before: Option = None; // Background compilation is far slower under sanitizer or coverage // instrumentation; bound the wait by time rather than by iterations. - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(120); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 600 } else { 120 }); while std::time::Instant::now() < deadline { let result = context.with(|ctx| { let function: Function = ctx.globals().get("layoutKernel").unwrap(); @@ -2708,17 +2794,21 @@ fn automatic_gpui_layout_kernel_enters_tier2_after_harmful_baseline_demotion() { assert_eq!(result, 165_580_141); jit.poll(); let metrics = jit.metrics(); - saw_demotion |= metrics.interpreter_demotions > 0; - if saw_demotion && metrics.tier2_entries > 0 { - assert!(metrics.profitability_rejected >= 5, "{metrics:?}"); - assert_eq!(metrics.deopts, 0, "{metrics:?}"); - // The profitable kernel queues its Baseline and Tier2 trials. The - // terminal host function is rejected synchronously before it can - // consume a worker queue slot. + // `terminalHost` may still be demoted on its own call-only path, so + // check the kernel through its native entries rather than the + // runtime-wide demotion count. + if let Some(before) = native_before { assert!( - metrics.queued >= 2, - "kernel Baseline and Tier2 trials were not queued: {metrics:?}" + metrics.native_entries > before, + "Baseline stopped entering native code before Tier2: {metrics:?}" ); + } + if metrics.native_entries > 0 { + native_before = Some(metrics.native_entries); + } + if metrics.tier2_entries > 0 { + assert!(metrics.profitability_rejected >= 5, "{metrics:?}"); + assert_eq!(metrics.deopts, 0, "{metrics:?}"); assert!( metrics.compile_failures > 0, "terminal host function must remain unsupported without blocking the profitable kernel: {metrics:?}" @@ -2728,7 +2818,7 @@ fn automatic_gpui_layout_kernel_enters_tier2_after_harmful_baseline_demotion() { std::thread::sleep(std::time::Duration::from_micros(50)); } panic!( - "harmful Tier1 never reached bounded Tier2 trial: {:?}", + "layout kernel never reached its Tier2 trial: {:?}", jit.metrics() ); } @@ -2770,7 +2860,8 @@ fn automatic_call_heavy_promotes_the_direct_edge_caller() { }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(15); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 75 } else { 15 }); while std::time::Instant::now() < deadline { jit.poll(); let before = jit.metrics(); @@ -2879,7 +2970,8 @@ fn stable_float64_loop_stays_native_without_a_side_path() { 5000.5 ); } - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while std::time::Instant::now() < deadline { jit.poll(); if jit.metrics().installed >= 2 { @@ -4548,7 +4640,8 @@ fn production_tier2_runs_the_int_arith_kernel_end_to_end() { .unwrap_or_else(|error| panic!("{error} {:?}", ctx.catch())) }) }; - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(120); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 600 } else { 120 }); while std::time::Instant::now() < deadline { assert_eq!(run(), expected); jit.poll(); @@ -4864,7 +4957,8 @@ fn signature_completes_when_the_first_invocation_returns_natively() { ) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(120); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 600 } else { 120 }); let mut saw_tier2 = false; while std::time::Instant::now() < deadline { let result = context.with(|ctx| { @@ -4978,7 +5072,8 @@ fn bool_argument_tagged_tier2_preserves_branches_and_type_change_deopt() { ) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(15); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 75 } else { 15 }); while jit.metrics().tier2_entries == 0 { context.with(|ctx| { let function: Function = ctx.globals().get("incrementIf").unwrap(); @@ -5276,7 +5371,8 @@ fn semantic_frame_state_deopt_preserves_phi_and_parameter_assignment() { ) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -5387,7 +5483,8 @@ fn semantic_values_execute_both_phi_edges_and_loop_entry_natively() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(source)).unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context.with(|ctx| ctx.eval::(warm)).unwrap(), @@ -5485,7 +5582,8 @@ fn semantic_float_mode_checks_a_phi_with_an_unobserved_integer_edge() { ctx.eval::<(), _>("function target(flag,a,b){let x;if(flag)x=a;else x=1;return x+b}") }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -5649,7 +5747,8 @@ fn semantic_cfg_facts_deopt_on_an_unchecked_float_phi_edge() { ctx.eval::<(), _>("function target(flag,a,b){let x;if(flag)x=a+1;else x=b;return x*2}") }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -5777,7 +5876,8 @@ fn semantic_comparisons_preserve_nan_and_negative_zero_natively() { context .with(|ctx| ctx.eval::<(), _>(format!("function target(a,b){{return a{operator}b}}"))) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -5917,7 +6017,8 @@ fn semantic_postfix_overflow_restores_pre_update_state() { ) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -6546,7 +6647,8 @@ fn mixed_scalar_loops_amortize_polls_and_remain_interruptible() { ) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(10); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while jit.metrics().tier2_entries < 10 && std::time::Instant::now() < deadline { assert_eq!( context @@ -6627,7 +6729,8 @@ fn deferred_scalar_locals_restore_dirty_values_after_poll_and_overflow() { context.with(|ctx| ctx.eval::<(), _>( "function dirtyLocals(n,a,enabled){let value=a,last=0;for(let i=0;i( "function updateOverflow(n,enabled){let x=2147483646;for(let i=0;i| -> rquickjs::Result<()> { let mut counters: rquickjs_core::qjs::JSJitHelperCounters = diff --git a/jit/tests/polymorphic_property_ic.rs b/jit/tests/polymorphic_property_ic.rs index 42bc5641..fd994065 100644 --- a/jit/tests/polymorphic_property_ic.rs +++ b/jit/tests/polymorphic_property_ic.rs @@ -216,7 +216,8 @@ fn production_element_receiver_kernel_never_enters_a_deopt_loop() { } fn wait_for(jit: &Jit, mut step: impl FnMut(), done: impl Fn(&rquickjs_jit::JitMetrics) -> bool) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { step(); jit.poll(); @@ -564,7 +565,8 @@ fn automatic_tiering_refreshes_a_terminal_baseline_with_property_ics() { |metrics| metrics.installed >= 2 && metrics.pending_worker_jobs == 0, ); let rt = raw_runtime(&context); - let settle = Instant::now() + Duration::from_secs(60); + let settle = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { assert_eq!( unsafe { rquickjs_core::qjs::JS_JitResetHelperCounters(rt) }, diff --git a/jit/tests/profitability_backoff.rs b/jit/tests/profitability_backoff.rs index 4b3b3fa6..1b68c85f 100644 --- a/jit/tests/profitability_backoff.rs +++ b/jit/tests/profitability_backoff.rs @@ -268,7 +268,8 @@ fn generic_call_fails_closed_for_a_mixed_unknown_phi_inside_a_loop() { }) }; - let deadline = std::time::Instant::now() + Duration::from_secs(60); + let deadline = std::time::Instant::now() + + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let mut disposition = None; let mut invocations = 0; for iteration in 0..10_000 { diff --git a/jit/tests/property_cache.rs b/jit/tests/property_cache.rs index 91e633ad..0583d837 100644 --- a/jit/tests/property_cache.rs +++ b/jit/tests/property_cache.rs @@ -27,7 +27,8 @@ fn setup(source: &str) -> (Runtime, Jit, Context) { } fn warm(jit: &Jit, mut call: impl FnMut()) { - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(15); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 75 } else { 15 }); loop { call(); jit.poll(); @@ -486,7 +487,8 @@ fn replacing_an_owned_local_keeps_property_effects_and_releases_the_old_value() }; // An object-producing call may retain its general bridge. Replacing its // owning result must still release that result and commit prior writes. - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(15); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 75 } else { 15 }); while jit.metrics().native_entries < 32 { call(); jit.poll(); @@ -666,7 +668,8 @@ fn loop_backedge_alias_store_invalidates_a_preheader_seed() { "globalThis.left={x:0};globalThis.right={x:0}; function target(a,b,n){a.x=1;let s=0;for(let i=0;i (f64, rquickjs_jit::JitMetrics) { + fn run(source: &str, expect_tier2: bool) -> (f64, rquickjs_jit::JitMetrics) { let runtime = Runtime::new().unwrap(); let jit = Jit::attach( &runtime, @@ -65,16 +65,25 @@ mod tier2_ownership { }) .unwrap(); let mut result = 0.0; - for _ in 0..200 { + // At least 200 calls. A caller expecting Tier 2 keeps calling until it + // is entered: slow (sanitizer) builds may queue the trial later. + let budget = if cfg!(rquickjs_sanitizer) { 300 } else { 60 }; + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(budget); + for call in 0.. { result = context.with(|ctx| { let workload: Function<'_> = ctx.globals().get("workload").unwrap(); let argument: Object<'_> = ctx.globals().get("workloadArgument").unwrap(); workload.call((2000, 7, argument)).unwrap() }); jit.poll(); - if jit.metrics().tier2_entries > 0 { + if jit.metrics().tier2_entries > 0 + || (call >= 199 && (!expect_tier2 || std::time::Instant::now() >= deadline)) + { break; } + if call >= 199 { + std::thread::sleep(std::time::Duration::from_millis(1)); + } } let metrics = jit.metrics(); drop(context); @@ -88,8 +97,10 @@ mod tier2_ownership { // `p.x = p.x + 1` keeps a second receiver alias below the get_field // operands. Before M2 each guarded access leaked one reference and // JS_FreeRuntime aborted on a non-empty gc_obj_list. - let (result, metrics) = - run("function workload(n,s,p){ for(let i=0;i 0, "{metrics:?}"); assert_eq!(metrics.native_fallbacks, 0, "{metrics:?}"); assert_eq!(metrics.deopts, 0, "{metrics:?}"); @@ -106,7 +117,7 @@ mod tier2_ownership { "function workload(n,s,p){ let q=p; let t=0; for(let i=0;i= 0.0, "{source}: {result}"); diff --git a/jit/tests/return_ownership.rs b/jit/tests/return_ownership.rs index b6a98c4b..a2325670 100644 --- a/jit/tests/return_ownership.rs +++ b/jit/tests/return_ownership.rs @@ -28,7 +28,8 @@ fn setup(stress: bool, source: &str) -> (Runtime, Jit, Context) { } fn warm(jit: &Jit, mut call: impl FnMut()) { - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(20); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 100 } else { 20 }); loop { let before = jit.metrics(); call(); diff --git a/jit/tests/scalar_codegen.rs b/jit/tests/scalar_codegen.rs index 42aa3128..9af4c194 100644 --- a/jit/tests/scalar_codegen.rs +++ b/jit/tests/scalar_codegen.rs @@ -120,7 +120,8 @@ fn warm_tier2_with( .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(source)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(20); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 100 } else { 20 }); loop { let before = jit.metrics(); let result = context.with(|ctx| { diff --git a/jit/tests/speculative_numeric.rs b/jit/tests/speculative_numeric.rs index d6fa037f..c78b9ff0 100644 --- a/jit/tests/speculative_numeric.rs +++ b/jit/tests/speculative_numeric.rs @@ -72,7 +72,8 @@ fn with_optimized_binary( .with(|ctx| ctx.eval::<(), _>(format!("function f(a,b){{return {body}}}"))) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while std::time::Instant::now() < deadline { context.with(|ctx| { let function: Function<'_> = ctx.globals().get("f").unwrap(); @@ -175,7 +176,8 @@ fn with_optimized_source(source: &str, warm: &str, check: impl FnOnce(&Context, let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(source)).unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while std::time::Instant::now() < deadline { context.with(|ctx| { let _: rquickjs::Value<'_> = ctx.eval(warm).unwrap(); @@ -310,7 +312,8 @@ fn with_optimized_loop(source: &str, warm: &str, check: impl FnOnce(&Context, &J )) }) .unwrap(); - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); while std::time::Instant::now() < deadline { context.with(|ctx| { let warm: Function<'_> = ctx.globals().get("__warm").unwrap(); diff --git a/jit/tests/tagged_call_link.rs b/jit/tests/tagged_call_link.rs index 24cae7e9..3d4a7f3c 100644 --- a/jit/tests/tagged_call_link.rs +++ b/jit/tests/tagged_call_link.rs @@ -73,7 +73,8 @@ fn exercise(policy: JitTierPolicy, force_tier2: bool, miss: (&str, &str, &str, & }) }; - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = call_count(&context); let entries = jit.metrics().native_entries; @@ -172,7 +173,8 @@ fn exercise_bool_result(policy: JitTierPolicy, force_tier2: bool) { }) }; - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = call_count(&context); let entries = jit.metrics().native_entries; @@ -282,7 +284,8 @@ impl Effectful { /// Warm until one complete invocation no longer reaches the generic CALL. fn wait_for_link(&self, expression: &str, force_tier2: bool) { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = call_count(&self.context); let entries = self.jit.metrics().native_entries; @@ -441,7 +444,8 @@ fn exercise_production_site(setup: &str, run: &str, expected: &str) { }) }) }; - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = call_count(&context); assert_eq!(eval(run), expected); diff --git a/jit/tests/tier1_arrays_typed.rs b/jit/tests/tier1_arrays_typed.rs index 01e22bb0..2d2dde89 100644 --- a/jit/tests/tier1_arrays_typed.rs +++ b/jit/tests/tier1_arrays_typed.rs @@ -66,7 +66,8 @@ fn arrays_typed_arrays_proxy_and_accessor_enter_native_with_exact_checksum() { // Keep the stable workload identity while allowing instrumented builds to // drain the bounded set of hot call and loop compilations. - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let mut checksum = 0_i32; while Instant::now() < deadline { checksum = context.with(|ctx| ctx.eval("elementKernel(a,t,p,1,40)").unwrap()); @@ -140,7 +141,8 @@ fn packed_and_typed_element_hits_skip_get_set_helpers_and_fallbacks_stay_exact() }) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while Instant::now() < deadline { context.with(|ctx| { let globals = ctx.globals(); @@ -282,7 +284,8 @@ fn arrays_typed_workload_keeps_native_entries_bounded_per_invocation() { // slower, and this workload discovers many hot functions at once. Keep the // multi-install precondition while allowing the single compiler worker to // make progress through that queue. - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while Instant::now() < deadline { context.with(|ctx| { let workload: Function<'_> = ctx.globals().get("workload").unwrap(); @@ -343,7 +346,8 @@ fn assert_automatic_mixed_array_trial(mutation: &str) { // Background compilation under sanitizers can outlast a fixed number of // quick interpreter calls. Allow the same bounded deadline as the array // workload test above, while continuing to execute and poll for Tier2. - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while Instant::now() < deadline { context.with(|ctx| { assert_eq!( diff --git a/jit/tests/tier1_calls_properties.rs b/jit/tests/tier1_calls_properties.rs index 2f2a28f3..7327bf9b 100644 --- a/jit/tests/tier1_calls_properties.rs +++ b/jit/tests/tier1_calls_properties.rs @@ -48,7 +48,8 @@ fn run_until_native(source: &str, expression: &str) -> (String, rquickjs_jit::Ji // Sanitizer builds can take tens of seconds to drain even this bounded, // stable set of function compilations when the test binary runs in // parallel. The function identities above remain fixed while we wait. - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let mut result = String::new(); while Instant::now() < deadline { result = context.with(|ctx| { @@ -85,7 +86,8 @@ fn local_state_call_keeps_the_generic_native_boundary() { ) .unwrap(); }); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { context.with(|ctx| { assert_eq!( @@ -193,7 +195,8 @@ fn suspend_stops_probes_and_resume_reuses_installed_code() { context .with(|ctx| ctx.eval::<(), _>("function hot(a){return a+1}")) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while Instant::now() < deadline && jit.metrics().native_entries == 0 { assert_eq!( context.with(|ctx| ctx.eval::("hot(41)")).unwrap(), @@ -269,7 +272,8 @@ fn baseline_only_direct_call_hit_skips_call_helper_and_misses_remain_exact() { }) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while Instant::now() < deadline { assert_eq!( context.with(|ctx| ctx.eval::("f(g,41)")).unwrap(), @@ -349,7 +353,8 @@ fn baseline_property_cache_hits_inline_and_mutation_misses_exactly() { ) }) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while Instant::now() < deadline { context.with(|ctx| { let globals = ctx.globals(); @@ -432,7 +437,8 @@ fn baseline_property_cache_accepts_bounded_polymorphic_shapes_under_stress_gc() ) }) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); while Instant::now() < deadline { assert_eq!( context.with(|ctx| ctx.eval::("readx(a)")).unwrap(), @@ -486,7 +492,8 @@ fn automatic_generic_call_entry_admits_the_bool_callee_to_tagged_tier2() { ) }) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(15); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 75 } else { 15 }); loop { context.with(|ctx| { assert_eq!( diff --git a/jit/tests/tier1_closures.rs b/jit/tests/tier1_closures.rs index f57ef09a..50f62ee0 100644 --- a/jit/tests/tier1_closures.rs +++ b/jit/tests/tier1_closures.rs @@ -222,7 +222,8 @@ fn baseline_only_tiering_runs_closure_creating_loops_natively() { ) .unwrap() }); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); let mut result = 0; while Instant::now() < deadline { result = context.with(|ctx| ctx.eval::("kernel(200)").unwrap()); @@ -273,7 +274,8 @@ fn closure_tdz_write_error_unwinds_live_operands_to_the_callers_handler() { } fn run_until_native(jit: &Jit, context: &Context, source: &str) -> (i32, u64) { - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); let mut result = 0; while Instant::now() < deadline { result = context.with(|ctx| ctx.eval::(source).unwrap()); diff --git a/jit/tests/tier1_constructors.rs b/jit/tests/tier1_constructors.rs index ffcb9f72..e7c433ba 100644 --- a/jit/tests/tier1_constructors.rs +++ b/jit/tests/tier1_constructors.rs @@ -30,7 +30,8 @@ fn tier1_enters_for_map_and_set_constructors() { .unwrap() }); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); let mut result = (0, 0); while Instant::now() < deadline { result = context.with(|ctx| { @@ -73,7 +74,8 @@ fn tier1_constructor_keeps_borrowed_argument_slots_owned_by_the_caller() { }) .unwrap(); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); let mut result = String::new(); while Instant::now() < deadline { result = context.with(|ctx| { diff --git a/jit/tests/tier1_exceptions.rs b/jit/tests/tier1_exceptions.rs index 88daaa48..45e6541e 100644 --- a/jit/tests/tier1_exceptions.rs +++ b/jit/tests/tier1_exceptions.rs @@ -195,7 +195,8 @@ fn production_with( context.with(|ctx| ctx.eval::<(), _>(source).unwrap()); // Slow (sanitizer) builds may still be compiling after `rounds`; keep // evaluating until the queued compilation has been installed. - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(120); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 600 } else { 120 }); let mut round = 0; let result = loop { let result = context.with(|ctx| ctx.eval::(expression).unwrap()); @@ -223,24 +224,42 @@ fn production_with( (interpreted, compiled, metrics) } +const HOT_EXCEPTION_LOOP: &str = "function f(n){ let caught=0, finals=0; for(let i=0;i JitConfig { + JitConfig::builder() + .tier_policy(JitTierPolicy::BaselineOnly) + .build() + .unwrap() +} + #[test] -fn production_tiering_runs_hot_exception_loops_natively() { - let (interpreted, compiled, metrics) = production( - "function f(n){ let caught=0, finals=0; for(let i=0;i 0, "{metrics:?}"); assert_eq!(metrics.native_retries, 0, "{metrics:?}"); assert_eq!(metrics.invalid_artifacts, 0, "{metrics:?}"); } +#[test] +fn automatic_tiering_keeps_exception_regions_interpreted() { + // Automatic tiering defers the opcodes Tier 1 gained in roadmap P2 until + // profitability can measure the interpreter; explicit policies still + // compile them (above). + let (interpreted, compiled, metrics) = production(HOT_EXCEPTION_LOOP, "f(4000)", 40); + assert_eq!(compiled, interpreted); + assert_eq!(metrics.native_entries, 0, "{metrics:?}"); + assert!(metrics.tier1_rejections > 0, "{metrics:?}"); +} + #[test] fn osr_enters_a_loop_header_inside_a_try_region() { // The first invocation is long enough to enter the loop through OSR with // the catch offset live on the interpreter operand stack. - let (interpreted, compiled, metrics) = production( + let (interpreted, compiled, metrics) = production_with( + baseline_only(), "function f(n){ let s = 0; try { for (let i = 0; i < n; i++) { s = (s + i) | 0; if (i === n - 3) throw s; } } catch (e) { return 'caught:' + e; } return 'done:' + s; }", "f(3000000)", 1, diff --git a/jit/tests/tier1_generic_ops.rs b/jit/tests/tier1_generic_ops.rs index a39c3126..a1f0a961 100644 --- a/jit/tests/tier1_generic_ops.rs +++ b/jit/tests/tier1_generic_ops.rs @@ -382,7 +382,8 @@ fn zero_argument_tier2_callee_deopts_under_a_tier1_generic_op_caller() { }); jit.poll(); }; - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(60); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while jit.metrics().tier2_entries == 0 { run(100.0); assert!( diff --git a/jit/tests/tier1_globals.rs b/jit/tests/tier1_globals.rs index 5080b19f..25c7dde3 100644 --- a/jit/tests/tier1_globals.rs +++ b/jit/tests/tier1_globals.rs @@ -30,7 +30,8 @@ fn tier1_enters_for_json_global_lookup() { .unwrap() }); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); let mut result = String::new(); while Instant::now() < deadline { result = context.with(|ctx| ctx.eval("stringifyKernel({answer:42})").unwrap()); diff --git a/jit/tests/tier1_iteration.rs b/jit/tests/tier1_iteration.rs index 5718b2d8..a75d6752 100644 --- a/jit/tests/tier1_iteration.rs +++ b/jit/tests/tier1_iteration.rs @@ -396,7 +396,8 @@ fn for_of_inside_a_try_region_closes_the_iterator_before_the_handler() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(definition).unwrap()); - let deadline = Instant::now() + Duration::from_secs(10); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 50 } else { 10 }); for iteration in 0.. { let result: String = context.with(|ctx| ctx.eval(expression).unwrap()); assert_eq!(result, expected); @@ -434,7 +435,8 @@ fn production_tiering_enters_native_code_for_a_for_of_kernel() { ctx.eval("(function(n){let s=0;for(let i=0;i(definition)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(5); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 25 } else { 5 }); for _ in 0..300 { context.with(|ctx| ctx.eval::<(), _>(warm)).unwrap(); jit.poll(); diff --git a/jit/tests/typed_receivers.rs b/jit/tests/typed_receivers.rs index e71ff3a6..ab10568d 100644 --- a/jit/tests/typed_receivers.rs +++ b/jit/tests/typed_receivers.rs @@ -248,7 +248,8 @@ fn prepared_traversal() -> (Runtime, Jit, Context) { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(SOURCE)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); context @@ -459,7 +460,8 @@ fn packed_local_receivers_match_the_same_version_interpreter() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(PACKED)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); assert_eq!( @@ -564,7 +566,8 @@ fn nested_detach_case(warm: &str, call: &str, target: &str, detached_destination .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(NESTED)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); context.with(|ctx| ctx.eval::(warm)).unwrap(); @@ -706,7 +709,8 @@ fn conditional_and_wide_receiver_loops_match_the_interpreter() { // the interpreter comparison still runs. let mut tier2_reached = true; for warm in ["maybeStore(1, W)", "fiveReceivers(0, W)"] { - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); loop { let before = jit.metrics(); context.with(|ctx| ctx.eval::(warm)).unwrap(); @@ -787,7 +791,8 @@ fn loop_header_guard_exit_republishes_an_empty_stack() { .unwrap(); let context = Context::full(&runtime).unwrap(); context.with(|ctx| ctx.eval::<(), _>(SOURCE)).unwrap(); - let deadline = Instant::now() + Duration::from_secs(60); + let deadline = + Instant::now() + Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); let mut entered = 0; while entered < 8 { let before = jit.metrics(); diff --git a/jit/tests/untranslatable_settle.rs b/jit/tests/untranslatable_settle.rs index 6af10463..aa53b89a 100644 --- a/jit/tests/untranslatable_settle.rs +++ b/jit/tests/untranslatable_settle.rs @@ -22,71 +22,35 @@ fn automatic_runtime() -> (rquickjs::Runtime, rquickjs_jit::Jit, rquickjs::Conte } #[test] -fn untranslatable_loop_settles_its_baseline_decision_once() { - // `typeof` has no optimized classification, so Tier 2 can never compile - // this function. Its baseline decision must be taken a bounded number of - // times instead of rebuilding feedback snapshots at every maintenance. - let (_runtime, jit, context) = automatic_runtime(); - context.with(|ctx| { - ctx.eval::<(), _>( - "globalThis.kinds = function(items) { let n = 0; \ - for (let i = 0; i < items.length; i++) { if (typeof items[i] === 'string') n++; } \ - return n; }; \ - globalThis.items = ['a', 1, 'b', {}, 'c'];", - ) - .unwrap(); - }); - let run = || { - let value = context.with(|ctx| ctx.eval::("kinds(items)").unwrap()); - assert_eq!(value, 3); - jit.poll(); - }; - wait_for_native_entry(&jit, run); - let mut evaluations = Vec::new(); - let mut entries = Vec::new(); - for _ in 0..4 { - for _ in 0..1_000 { - run(); - } - let metrics = jit.metrics(); - evaluations.push(metrics.profitability_evaluations); - entries.push(metrics.native_entries); - } - let metrics = jit.metrics(); - assert_eq!(metrics.tier2_entries, 0, "{metrics:?}"); - assert_eq!(metrics.unsupported_opcode_failures, 0, "{metrics:?}"); - assert!( - evaluations.windows(2).all(|pair| pair[0] == pair[1]) && evaluations[0] <= 5, - "untranslatable candidate kept re-evaluating: {evaluations:?} {metrics:?}" - ); - // The settled generation runs in the interpreter with its probes off, - // exactly where a failed bounded Tier 2 trial used to leave it. The - // first window, starting at install, serves the short baseline warmup. - assert!( - entries.windows(2).all(|pair| pair[0] == pair[1]), - "settled generation kept entering native code: {entries:?} {metrics:?}" +fn automatic_tiering_keeps_typeof_loops_interpreted() { + // `typeof` is one of the opcodes Tier 1 gained in roadmap P2. Automatic + // tiering defers them until profitability can measure the interpreter, so + // this loop stays interpreted as it did at 0.12.9 and never reaches the + // untranslatable settle. + let metrics = interpreted_after_rounds( + "globalThis.kinds = function(items) { let n = 0; \ + for (let i = 0; i < items.length; i++) { if (typeof items[i] === 'string') n++; } \ + return '' + n; }; \ + globalThis.items = ['a', 1, 'b', {}, 'c'];", + "kinds(items)", + "3", ); + assert_eq!(metrics.profitability_evaluations, 0, "{metrics:?}"); } #[test] -fn untranslatable_call_only_method_returns_to_the_interpreter() { - let (_runtime, jit, context) = automatic_runtime(); - context.with(|ctx| { - ctx.eval::<(), _>( - "function Box(v) { this.v = v; } \ - Box.prototype.twice = function() { return this.add(this.v); }; \ - Box.prototype.add = function(x) { return this.v + x; }; \ - globalThis.box = new Box(21);", - ) - .unwrap(); - }); - for _ in 0..4_000 { - let value = context.with(|ctx| ctx.eval::("box.twice()").unwrap()); - assert_eq!(value, 42); - jit.poll(); - } - let metrics = jit.metrics(); - assert!(metrics.generic_call_rejections > 0, "{metrics:?}"); +fn automatic_tiering_keeps_this_methods_interpreted() { + // `push_this` is deferred with the other P2 opcodes, so a call-only method + // is rejected before it can reach the generic-call demotion. + let metrics = interpreted_after_rounds( + "function Box(v) { this.v = v; } \ + Box.prototype.twice = function() { return this.add(this.v); }; \ + Box.prototype.add = function(x) { return this.v + x; }; \ + globalThis.box = new Box(21);", + "'' + box.twice()", + "42", + ); + assert_eq!(metrics.generic_call_rejections, 0, "{metrics:?}"); } #[test] @@ -138,14 +102,10 @@ fn untranslatable_object_loops_stay_exact_after_their_bounded_trial() { } #[test] -fn untranslatable_property_loop_settles_instead_of_taking_a_terminal_baseline_refresh() { - // Interaction regression (P2b settle x P4c terminal baseline refresh): - // `typeof` keeps Tier 2 out, and the `get_field` sites acquire property - // feedback, so the function is also a terminal-baseline refresh - // candidate. The settle owns it: a refresh queued before the settle - // leaves no installed baseline to demote, and its later install kept the - // generation entering native code with its probes off. - let entries = native_entry_windows_after_install( +fn automatic_tiering_keeps_typeof_property_loops_interpreted() { + // The P2b settle x P4c terminal-refresh interaction cannot arise while + // automatic tiering defers `typeof`: the loop is never installed. + interpreted_after_rounds( "globalThis.points = [{ x: 1, y: 'a' }, { x: 2, y: 3 }, { x: 3, y: 'b' }]; \ globalThis.f = function(items) { let n = 0; \ for (let i = 0; i < items.length; i++) { \ @@ -154,12 +114,22 @@ fn untranslatable_property_loop_settles_instead_of_taking_a_terminal_baseline_re "f(points)", "4", ); - // `entries[0]` is sampled at install; the first window serves the short - // baseline warmup before the settle. - assert!( - entries[1..].windows(2).all(|pair| pair[0] == pair[1]), - "settled generation kept entering native code: {entries:?}" - ); +} + +/// Runs `call` for 4,000 rounds under automatic tiering and asserts it stays +/// exact and interpreted, rejected at Tier 1. +fn interpreted_after_rounds(source: &str, call: &str, expected: &str) -> rquickjs_jit::JitMetrics { + let (_runtime, jit, context) = automatic_runtime(); + context.with(|ctx| ctx.eval::<(), _>(source).unwrap()); + for _ in 0..4_000 { + let value = context.with(|ctx| ctx.eval::(call).unwrap()); + assert_eq!(value, expected); + jit.poll(); + } + let metrics = jit.metrics(); + assert_eq!(metrics.native_entries, 0, "{metrics:?}"); + assert!(metrics.tier1_rejections > 0, "{metrics:?}"); + metrics } /// Runs `call` repeatedly under automatic tiering and returns the @@ -188,7 +158,8 @@ fn native_entry_windows_after_install(source: &str, call: &str, expected: &str) /// background, and unoptimized (debug, coverage) builds or a busy host may /// install it only after many calls. fn wait_for_native_entry(jit: &rquickjs_jit::Jit, run: impl Fn()) { - let deadline = std::time::Instant::now() + std::time::Duration::from_secs(60); + let deadline = std::time::Instant::now() + + std::time::Duration::from_secs(if cfg!(rquickjs_sanitizer) { 300 } else { 60 }); while jit.metrics().native_entries == 0 { assert!( std::time::Instant::now() < deadline,