Subprocess wall-clock; times in ms, median of N=10 timed
runs after 1 discarded warmup run. * flags a fixture
whose max-min spread exceeded 10% — treat that cell as noisy.
All JIT engines run JIT-disabled (interpreter tier only): v8
--jitless, sm --no-baseline --no-ion, jsc JSC_useJIT=0.
Internal regression compass — not published.
Host: Darwin 25.6.0 arm64. Generated by tools/bench-cross.sh.
| fixture | cynic (n=10) | qjs (n=10) | v8 (n=10) | sm (n=10) | jsc (n=10) | hermes (n=10) |
|---|---|---|---|---|---|---|
| arith_loop | 41 | 76 | 74 | 79* | 59* | 80* |
| array_iter | 23 | 24 | 40 | 92* | 22 | 31* |
| class_instantiate | 125 | 65* | 31 | 23* | 20 | ERR |
| json_stringify | 41 | 66 | 23* | 17 | 10 | 26* |
| method_call | 36 | 18 | 32* | 24 | 19 | ERR |
| object_alloc | 48 | 56* | 29* | 18 | 14 | 14 |
| promise_chain | 14* | 11 | 20* | 15* | 7* | 10 |
| prop_access | 14 | 15 | 30 | 25 | 21 | 10 |
| prop_write | 17* | 16 | 30 | 24* | 19 | 11* |
| string_concat | 45 | 49 | 31* | 19 | 17 | 152* |
| tail_recursion | 89* | ERR | ERR | ERR | 29* | ERR |
Noisy cells (>10% spread):
- cynic/promise_chain: 14% spread
- cynic/prop_write: 17% spread
- cynic/tail_recursion: 14% spread
- qjs/class_instantiate: 15% spread
- qjs/object_alloc: 23% spread
- v8/json_stringify: 17% spread
- v8/method_call: 12% spread
- v8/object_alloc: 113% spread
- v8/promise_chain: 20% spread
- v8/string_concat: 12% spread
- sm/arith_loop: 12% spread
- sm/array_iter: 70% spread
- sm/class_instantiate: 13% spread
- sm/promise_chain: 13% spread
- sm/prop_write: 33% spread
- jsc/arith_loop: 11% spread
- jsc/promise_chain: 14% spread
- jsc/tail_recursion: 127% spread
- hermes/arith_loop: 28% spread
- hermes/array_iter: 54% spread
- hermes/json_stringify: 23% spread
- hermes/prop_write: 18% spread
- hermes/string_concat: 128% spread
Interpreter-tier-only, internal compass. Do not publish; do
not append to bench-results.md (that file is the single-engine
zig build bench artifact).