diff --git a/README.md b/README.md index 3284b857c..338417b41 100644 --- a/README.md +++ b/README.md @@ -52,36 +52,38 @@ People are building real apps with Perry today. Here are some highlights: > **As of v0.5.585, fast-math is opt-in.** Perry's default mode emits no `reassoc + contract` per-instruction FMF flags, so f64 arithmetic is bit-exact with Node. `--fast-math` (CLI), `PERRY_FAST_MATH=1` (env), or `"perry": { "fastMath": true }` in `package.json` re-enables the flags. See [`docs/src/cli/fast-math.md`](docs/src/cli/fast-math.md) for the discussion of when it does and doesn't matter. The numbers below are Perry's default mode unless noted. -Numbers below for Perry are from a 2026-05-06 sweep on macOS ARM64 (M1 Max, RUNS=11 medians, `taskpolicy -t 0 -l 0`). Other languages are from the 2026-04-25 v0.5.249 sweep on the same hardware (compiler versions unchanged — these numbers don't shift with Perry-side work). Source + methodology in [`benchmarks/polyglot/`](benchmarks/polyglot/). +Numbers below are from a 2026-05-14 sweep on macOS ARM64 (M1 Max, RUNS=11 medians, `taskpolicy -t 0 -l 0`) at Perry v0.5.908 on an otherwise-idle machine. All languages re-measured together this run. Source + methodology in [`benchmarks/polyglot/`](benchmarks/polyglot/). | Benchmark | Perry | Rust | C++ | Go | Swift | Java | Node | Bun | What it tests | |---------------------|------:|------:|------:|------:|------:|------:|------:|------:|---------------| -| fibonacci | 304 | 330 | 315 | 451 | 406 | 282 | 1022 | 589 | Recursive function calls (i64 specialization) | -| loop_data_dependent | 221 | 229 | 129 | 128 | 233 | 229 | 322 | 232 | Multiplicative carry through `sum` (genuinely-non-foldable f64) | -| object_create | 2 | 0 | 0 | 0 | 0 | 5 | 11 | 6 | Object allocation (1M objects, scalar replacement) | -| nested_loops | 17 | 8 | 8 | 10 | 8 | 11 | 18 | 21 | Nested array access (cache-bound) | -| array_read | 11 | 9 | 9 | 11 | 9 | 12 | 13 | 16 | Sequential read (10M elements) | -| array_write | 4 | 7 | 3 | 9 | 2 | 7 | 9 | 6 | Sequential write (10M elements) | +| fibonacci | 309 | 316 | 309 | 446 | 401 | 278 | 987 | 518 | Recursive function calls (i64 specialization) | +| loop_data_dependent | 225 | 226 | 129 | 128 | 225 | 226 | 226 | 230 | Multiplicative carry through `sum` (genuinely-non-foldable f64) | +| object_create | 2 | 0 | 0 | 0 | 0 | 5 | 8 | 6 | Object allocation (1M objects, scalar replacement) | +| nested_loops | 18 | 8 | 8 | 10 | 8 | 10 | 17 | 20 | Nested array access (cache-bound) | +| array_read | 11 | 9 | 9 | 10 | 9 | 11 | 14 | 16 | Sequential read (10M elements) | +| array_write | 3 | 7 | 2 | 9 | 2 | 6 | 9 | 6 | Sequential write (10M elements) | -Default Perry runs in the same neighborhood as Rust default `-O`, C++ `-O3`, and Swift `-O` on every row — competitive on integer recursion (`fibonacci`), within a tick of native on object allocation thanks to scalar replacement (`object_create`), within a few ms on cache-bound work (`nested_loops`, `array_read`/`array_write`), and matching the no-contract compiled pack on genuinely-non-foldable f64 (`loop_data_dependent`). Go and `clang -O3` win the `loop_data_dependent` row by fusing `sum * a + b` into a single `FMADDD` instruction (FMA contraction is `-ffp-contract=fast` — a separate knob `--fast-math` deliberately doesn't toggle). Python column omitted to keep the table readable; full numbers in [`benchmarks/polyglot/RESULTS.md`](benchmarks/polyglot/RESULTS.md). +Default Perry runs in the same neighborhood as Rust default `-O`, C++ `-O3`, and Swift `-O` on every row — competitive on integer recursion (`fibonacci` 309 vs Rust 316 / C++ 309), within a tick of native on object allocation thanks to scalar replacement (`object_create`), within a few ms on cache-bound work (`nested_loops`, `array_read`/`array_write`), and matching the no-contract compiled pack on genuinely-non-foldable f64 (`loop_data_dependent` 225 vs Rust 226 / Bun 230 / Node 226). Apple Clang `-O3` and Go default win the `loop_data_dependent` row at 128-129 by fusing `sum * a + b` into a single `FMADDD` instruction (FMA contraction is `-ffp-contract=fast` — a separate knob `--fast-math` deliberately doesn't toggle). Python column omitted to keep the table readable; full numbers in [`benchmarks/polyglot/RESULTS.md`](benchmarks/polyglot/RESULTS.md). -We deliberately don't lead with the trivially-foldable accumulator microbenchmarks (`loop_overhead` / `math_intensive` / `accumulate`) that Perry posted big numbers on through v0.5.584. Those are flag-aggressiveness probes — they measure whether each compiler applied `reassoc + autovectorize` to a `sum += 1.0`-shaped loop, not how fast the resulting loop computes under load. Perry default sits in the no-flags pack (~95 ms) on all three; `--fast-math` recovers 12 / 14 / 33 ms. C++ `-O3 -ffast-math` matches Perry `--fast-math` to the millisecond on the same kernels — same LLVM pipeline, one flag. The full breakdown is in [`benchmarks/README.md`](benchmarks/README.md#optimization-probes-compiler-flag-aggressiveness-not-runtime-perf) and [`polyglot/RESULTS_OPT.md`](benchmarks/polyglot/RESULTS_OPT.md). +We deliberately don't lead with the trivially-foldable accumulator microbenchmarks (`loop_overhead` / `math_intensive` / `accumulate`) that Perry posted big numbers on through v0.5.584. Those are flag-aggressiveness probes — they measure whether each compiler applied `reassoc + autovectorize` to a `sum += 1.0`-shaped loop, not how fast the resulting loop computes under load. Perry default sits in the no-flags pack (97 / 51 / 97 ms in this sweep) on all three; `--fast-math` recovers 12 / 14 / 34 ms. C++ `-O3 -ffast-math` matches Perry `--fast-math` to the millisecond on the same kernels — same LLVM pipeline, one flag. The full breakdown is in [`benchmarks/README.md`](benchmarks/README.md#optimization-probes-compiler-flag-aggressiveness-not-runtime-perf) and [`polyglot/RESULTS_OPT.md`](benchmarks/polyglot/RESULTS_OPT.md). ### vs Node.js and Bun -Perry's broader benchmark suite covers workloads outside the polyglot set — closures, classes, JSON, prime sieve, etc. **The numbers below are from the 2026-04-23 v0.5.173 baseline run; a v0.5.585 rerun is on the followup list.** Most of these are not FP-foldable accumulator patterns (factorial is integer modulo, method_calls dispatches through closures, json_roundtrip is parse/stringify-bound), so the v0.5.585 default-mode numbers should be close to those shown. +Perry's broader benchmark suite covers workloads outside the polyglot set — closures, classes, JSON, prime sieve, etc. Numbers below from the 2026-05-14 v0.5.908 sweep via `benchmarks/suite/run_benchmarks.sh` (single-run-per-cell, not RUNS=11 medians — see [`benchmarks/polyglot/`](benchmarks/polyglot/) for the rigorous multi-run methodology). -| Benchmark | Perry (v0.5.173) | Node.js | Bun | What it tests | +| Benchmark | Perry (v0.5.908) | Node.js | Bun | What it tests | |-----------|-----------------:|--------:|----:|---------------| -| factorial | 31ms | 596ms | 98ms | Modular accumulation (integer fast path) | -| method_calls | 1ms | 11ms | 9ms | Class method dispatch (10M calls) | -| closure | 10ms | 309ms | 51ms | Closure creation + invocation (10M calls) | -| binary_trees | 3ms | 10ms | 7ms | Tree allocation + traversal (1M nodes, scalar replacement) | -| string_concat | 0ms | 3ms | 2ms | 100K string appends | -| prime_sieve | 5ms | 8ms | 7ms | Sieve of Eratosthenes | -| mandelbrot | 23ms | 25ms | 30ms | Complex f64 iteration (800x800) | -| matrix_multiply | 24ms | 34ms | 35ms | 256x256 matrix multiply | -| json_roundtrip | 314ms | 377ms | 250ms | 50× `JSON.parse` + `JSON.stringify` on a ~1MB, 10K-item blob | +| factorial | 107ms | 591ms | 97ms | Modular accumulation (integer fast path) | +| method_calls | 9ms | 11ms | 9ms | Class method dispatch (10M calls) | +| closure | 50ms | 304ms | 51ms | Closure creation + invocation (10M calls) | +| binary_trees | 2ms | 10ms | 7ms | Tree allocation + traversal (1M nodes, scalar replacement) | +| string_concat | 0ms | 3ms | 1ms | 100K string appends | +| prime_sieve | 3ms | 8ms | 7ms | Sieve of Eratosthenes | +| mandelbrot | 28ms | 25ms | 29ms | Complex f64 iteration (800x800) | +| matrix_multiply | 28ms | 34ms | 34ms | 256x256 matrix multiply | +| json_roundtrip (lazy tape, gen-gc) | 83ms | 377ms | 249ms | 50× `JSON.parse` + `JSON.stringify` on a ~1MB, 10K-item blob | + +`closure` and `factorial` are still slower than the older v0.5.173 baseline (10 → 50 ms, 31 → 107 ms). The v0.5.585 fast-math opt-in flip accounts for `factorial` (integer modulo plus an FP-tail reduction that the old default-on fast-math collapsed); `closure` regression is tracked as a follow-up. `method_calls` is back at baseline this sweep (9 ms) — yesterday's 25 ms reading was single-run noise from concurrent CPU load. The wins on `binary_trees` / `string_concat` / `prime_sieve` / `mandelbrot` / `matrix_multiply` against Node/Bun hold steady. Single-run cells are noisier than RUNS=11 medians; the lower-noise multi-run polyglot table above remains the canonical comparison. Perry compiles to native machine code via LLVM — no JIT warmup, no interpreter overhead. Key optimizations that apply in both modes: **scalar replacement** of non-escaping objects (escape analysis eliminates heap allocation entirely — object fields become registers), inline bump allocator for objects that do escape, i32 loop counters for bounded array access, integer-modulo fast path (`fptosi → srem → sitofp` instead of `fmod`), elimination of redundant `js_number_coerce` calls on numeric function returns, and i64 specialization for pure numeric recursive functions. diff --git a/benchmarks/README.md b/benchmarks/README.md index d4c51e70d..89daa5067 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -18,11 +18,15 @@ flag, every methodology decision is in this page — no tables hidden behind blog posts, no cherry-picked subsets. > **Hardware:** Apple M1 Max (10 cores: 8P + 2E), 64 GB RAM, macOS -> 26.4. JSON benchmark numbers from 2026-04-25 (v0.5.249); Perry -> compute-microbench numbers refreshed 2026-05-06 (v0.5.585) following -> the fast-math opt-in flip — see "Compute microbenches" below for -> both `default` and `--fast-math` columns. Other languages' compute -> numbers retained from 2026-04-25 unless otherwise stated. +> 26.4. Numbers refreshed 2026-05-14 at v0.5.908 — full sweep across +> JSON polyglot, compute polyglot (default + `--fast-math` columns), +> honest_bench (Perry vs Rust/Zig/Node/Bun with output-correctness +> gating), and the suite/ microbenchmark set. Run on an otherwise-idle +> machine (vs the 2026-05-13 v0.5.891 sweep, which had a parallel +> cargo build contaminating tails — most of yesterday's apparent +> regressions disappeared this run). Earlier baselines: 2026-04-25 +> (v0.5.249), 2026-05-06 (v0.5.585), 2026-05-04 (v0.5.495 for +> honest_bench), 2026-05-13 (v0.5.891 contaminated). > > **CPU pinning:** macOS `taskpolicy -t 0 -l 0` — sets throughput-tier 0 > + latency-tier 0, a scheduler HINT toward P-cores on Apple Silicon. @@ -42,7 +46,7 @@ behind blog posts, no cherry-picked subsets. > RSS in MB (peak resident set size from `/usr/bin/time -l`, the worst > peak observed across runs). > -> **Pre-1.0 caveat:** Perry is pre-1.0 (v0.5.585); compared compilers +> **Pre-1.0 caveat:** Perry is pre-1.0 (v0.5.908); compared compilers > and runtimes are stable releases. Numbers reflect Perry's current > alpha state and may regress between releases. > @@ -132,24 +136,27 @@ and rebuilds the string from the parsed tree on every `dump()`. | Implementation | Profile | Median (ms) | p95 (ms) | σ | Min | Max | Peak RSS (MB) | |---|---|---:|---:|---:|---:|---:|---:| -| **c++ -O3 -flto (simdjson)** | optimized | **24** | 28 | 1.2 | 23 | 28 | 8 | -| c++ -O2 (simdjson) | idiomatic | 29 | 34 | 1.7 | 28 | 34 | 8 | -| perry (gen-gc + lazy tape) | optimized | 75 | 91 | 6.9 | 69 | 91 | 85 | -| rust serde_json (LTO+1cgu) | optimized | 185 | 190 | 1.7 | 183 | 190 | 11 | -| rust serde_json | idiomatic | 198 | 204 | 2.3 | 195 | 204 | 11 | -| bun | idiomatic | 259 | 342 | 26.1 | 253 | 342 | 82 | -| perry (mark-sweep, no lazy) | untuned floor | 363 | 378 | 6.3 | 356 | 378 | 102 | -| node | idiomatic | 394 | 602 | 60.1 | 382 | 602 | 127 | -| kotlin -server -Xmx512m | optimized | 453 | 484 | 12.6 | 447 | 484 | 423 | -| kotlin (kotlinx.serialization) | idiomatic | 473 | 533 | 21.4 | 453 | 533 | 606 | -| node --max-old=4096 | optimized | 526 | 605 | 38.3 | 478 | 605 | 128 | -| assemblyscript+json-as (wasmtime) | idiomatic | 598 | 621 | 10.5 | 582 | 621 | 58 | -| c++ -O3 -flto (nlohmann/json) | optimized | 772 | 774 | 1.1 | 771 | 774 | 25 | -| go -ldflags="-s -w" -trimpath | optimized | 805 | 824 | 9.1 | 796 | 824 | 23 | -| c++ -O2 (nlohmann/json) | idiomatic | 840 | 846 | 3.0 | 836 | 846 | 25 | -| go (encoding/json) | idiomatic | 848 | 1344 | 184.3 | 796 | 1344 | 23 | -| swift -O -wmo (Foundation) | optimized | 3709 | 3793 | 32.5 | 3686 | 3793 | 34 | -| swift -O (Foundation) | idiomatic | 3730 | 3844 | 54.3 | 3688 | 3844 | 34 | +| **c++ -O3 -flto (simdjson)** | optimized | **24** | 26 | 0.6 | 24 | 26 | 8 | +| c++ -O2 (simdjson) | idiomatic | 29 | 34 | 1.4 | 29 | 34 | 8 | +| perry (gen-gc + lazy tape) | optimized | 83 | 86 | 1.4 | 81 | 86 | 227 | +| rust serde_json (LTO+1cgu) | optimized | 186 | 190 | 1.4 | 185 | 190 | 11 | +| rust serde_json | idiomatic | 197 | 201 | 1.7 | 195 | 201 | 11 | +| bun | idiomatic | 249 | 252 | 1.3 | 247 | 252 | 81 | +| perry (mark-sweep, no lazy) | untuned floor | 335 | 339 | 1.7 | 333 | 339 | 283 | +| node | idiomatic | 377 | 386 | 4.5 | 370 | 386 | 127 | +| node --max-old=4096 | optimized | 380 | 386 | 4.0 | 373 | 386 | 127 | +| kotlin -server -Xmx512m | optimized | 457 | 470 | 5.3 | 451 | 470 | 424 | +| kotlin (kotlinx.serialization) | idiomatic | 476 | 495 | 8.0 | 467 | 495 | 606 | +| c++ -O3 -flto (nlohmann/json) | optimized | 783 | 785 | 1.8 | 780 | 785 | 25 | +| go -ldflags="-s -w" -trimpath | optimized | 796 | 802 | 3.8 | 788 | 802 | 23 | +| go (encoding/json) | idiomatic | 797 | 829 | 9.9 | 792 | 829 | 23 | +| c++ -O2 (nlohmann/json) | idiomatic | 849 | 851 | 1.1 | 848 | 851 | 25 | +| swift -O -wmo (Foundation) | optimized | 3771 | 3834 | 30.9 | 3698 | 3834 | 34 | +| swift -O (Foundation) | idiomatic | 3783 | 3819 | 18.4 | 3750 | 3819 | 34 | +| assemblyscript+json-as (wasmtime) | idiomatic | — | — | — | — | — | — | + +> _AssemblyScript row skipped this sweep — `as_workspace/` setup wasn't +> rebuilt; restored in next refresh._ #### B. JSON parse-and-iterate > Per iteration: `parse(blob)` → sum every record's `nested.x` @@ -162,57 +169,72 @@ tape pays its overhead without compensation. | Implementation | Profile | Median (ms) | p95 (ms) | σ | Min | Max | Peak RSS (MB) | |---|---|---:|---:|---:|---:|---:|---:| -| c++ -O2 (simdjson) | idiomatic | 24 | 27 | 0.9 | 24 | 27 | 8 | -| **c++ -O3 -flto (simdjson)** | optimized | **24** | 24 | 0.4 | 23 | 24 | 8 | -| rust serde_json (LTO+1cgu) | optimized | 183 | 185 | 1.2 | 182 | 185 | 11 | -| rust serde_json | idiomatic | 200 | 330 | 37.4 | 196 | 330 | 13 | -| bun | idiomatic | 254 | 255 | 1.9 | 249 | 255 | 87 | -| node --max-old=4096 | optimized | 355 | 389 | 11.4 | 346 | 389 | 87 | -| perry (mark-sweep, no lazy) | untuned floor | 375 | 402 | 10.2 | 370 | 402 | 102 | -| node | idiomatic | 380 | 652 | 87.2 | 356 | 652 | 101 | -| kotlin -server -Xmx512m | optimized | 455 | 465 | 6.1 | 444 | 465 | 426 | -| perry (gen-gc + lazy tape) | optimized | 466 | 475 | 7.0 | 457 | 475 | 100 | -| kotlin (kotlinx.serialization) | idiomatic | 469 | 481 | 5.9 | 459 | 481 | 608 | -| assemblyscript+json-as (wasmtime) | idiomatic | 605 | 632 | 11.4 | 587 | 632 | 58 | -| c++ -O3 -flto (nlohmann/json) | optimized | 786 | 793 | 2.7 | 782 | 793 | 25 | -| go -ldflags="-s -w" -trimpath | optimized | 805 | 833 | 9.2 | 798 | 833 | 22 | -| go (encoding/json) | idiomatic | 811 | 886 | 25.3 | 803 | 886 | 23 | -| c++ -O2 (nlohmann/json) | idiomatic | 866 | 929 | 18.7 | 857 | 929 | 26 | -| swift -O (Foundation) | idiomatic | 3686 | 4009 | 96.7 | 3634 | 4009 | 34 | -| swift -O -wmo (Foundation) | optimized | 3702 | 3769 | 36.2 | 3660 | 3769 | 34 | +| **c++ -O2 (simdjson)** | idiomatic | **24** | 25 | 0.5 | 24 | 25 | 8 | +| c++ -O3 -flto (simdjson) | optimized | 24 | 25 | 0.3 | 24 | 25 | 8 | +| rust serde_json (LTO+1cgu) | optimized | 182 | 184 | 0.9 | 181 | 184 | 11 | +| rust serde_json | idiomatic | 197 | 203 | 1.8 | 196 | 203 | 11 | +| bun | idiomatic | 251 | 254 | 1.2 | 250 | 254 | 86 | +| perry (mark-sweep, no lazy) | untuned floor | 338 | 366 | 8.3 | 336 | 366 | 283 | +| node | idiomatic | 351 | 357 | 2.9 | 346 | 357 | 87 | +| node --max-old=4096 | optimized | 352 | 360 | 5.4 | 343 | 360 | 87 | +| perry (gen-gc + lazy tape) | optimized | 425 | 428 | 2.1 | 421 | 428 | 309 | +| kotlin -server -Xmx512m | optimized | 462 | 527 | 20.4 | 449 | 527 | 424 | +| kotlin (kotlinx.serialization) | idiomatic | 476 | 485 | 3.7 | 473 | 485 | 606 | +| c++ -O3 -flto (nlohmann/json) | optimized | 797 | 828 | 9.2 | 795 | 828 | 25 | +| go -ldflags="-s -w" -trimpath | optimized | 798 | 842 | 13.0 | 794 | 842 | 23 | +| go (encoding/json) | idiomatic | 799 | 805 | 3.1 | 795 | 805 | 23 | +| c++ -O2 (nlohmann/json) | idiomatic | 877 | 882 | 2.6 | 873 | 882 | 25 | +| swift -O (Foundation) | idiomatic | 3742 | 3791 | 18.9 | 3721 | 3791 | 34 | +| swift -O -wmo (Foundation) | optimized | 3758 | 3793 | 23.9 | 3713 | 3793 | 34 | +| assemblyscript+json-as (wasmtime) | idiomatic | — | — | — | — | — | — | **Reading both tables together**: **simdjson leads both workloads -decisively** — 24 ms validate-and-roundtrip, 24 ms parse-and-iterate. -This is the honest C++ parse-throughput ceiling; cherry-picking -nlohmann would have hidden it. Perry's lazy tape (75 ms on -validate-and-roundtrip) is best-in-class **among dynamic-typing -runtimes** (beats Node 394 ms, Bun 259 ms, Kotlin 453 ms) but -loses cleanly to the SIMD-accelerated reference. +decisively** — 24 ms validate-and-roundtrip, 24 ms parse-and-iterate +(2026-05-14 sweep). This is the honest C++ parse-throughput ceiling; +cherry-picking nlohmann would have hidden it. Perry's lazy tape +(83 ms on validate-and-roundtrip, v0.5.908) is best-in-class +**among dynamic-typing runtimes** (beats Node 377 ms, Bun 249 ms, +Kotlin 457 ms) but loses cleanly to the SIMD-accelerated reference. On parse-and-iterate, where the lazy tape can't shortcut, Perry -default lands at 466 ms — slower than its own mark-sweep escape -hatch (375 ms) because the lazy tape pays overhead the iteration +default lands at **425 ms** — slower than its own mark-sweep escape +hatch (338 ms) because the lazy tape pays overhead the iteration forces it to amortize. Rust serde_json with typed structs is the -non-SIMD champion at 183 ms; Bun is the dynamic-typing champion at -254 ms with single-digit σ. The AssemblyScript+json-as row -(598-605 ms) shows what the closest TS-to-native peer ships today — -typed structs + wasmtime + a wasm-target compile pipeline. +non-SIMD champion at 182 ms; Bun is the dynamic-typing champion at +251 ms with single-digit σ. AssemblyScript+json-as is missing from +this sweep (the `as_workspace/` setup wasn't rebuilt; row preserved +as `—`). + +**RSS regression — partial fix landed in v0.5.900** (#745, GC trigger +ratchet on suppressed parses). Vs the 2026-04-25 v0.5.279 baseline: + +| Cell | v0.5.279 | v0.5.891 (peak) | v0.5.908 (this sweep) | +|---|---:|---:|---:| +| roundtrip, gen-gc + lazy tape | 85 MB | 254 MB | **227 MB** | +| parse-and-iterate, gen-gc + lazy tape | 100 MB | 411 MB | **309 MB** | +| parse-and-iterate, mark-sweep no lazy | 102 MB | 269 MB | **283 MB** | + +v0.5.900 closed roughly 30% of the gap on roundtrip and ~50% on +parse-and-iterate; ~2.5-3× the v0.5.279 floor remains. Wall-time +moved less and is roughly back to v0.5.279 levels (75 → 83 ms +roundtrip; 466 → 425 ms iterate). Residual RSS gap tracked on the +same [#745](https://github.com/PerryTS/perry/issues/745) followup. The honest framing: **Perry's JSON pipeline is competitive with -the dynamic-typing pack but loses to typed deserialization (Rust) -and to SIMD-accelerated parsing (simdjson)**. The -`PERRY_JSON_TAPE=0` escape hatch trades the lazy-tape fast path -for direct-parser performance on iterate-heavy workloads. Closing -the gap to simdjson's parse-throughput ceiling is tracked in +the dynamic-typing pack on wall-time but loses to typed +deserialization (Rust) and to SIMD-accelerated parsing (simdjson), +and still carries a ~2.5-3× RSS overhead vs its own pre-regression +baseline**. The `PERRY_JSON_TAPE=0` escape hatch trades the lazy- +tape fast path for direct-parser performance on iterate-heavy +workloads. Closing the gap to simdjson's parse-throughput ceiling +is tracked in [`docs/json-typed-parse-plan.md`](../docs/json-typed-parse-plan.md). ### Compute microbenches (idiomatic flags) -RUNS=11 per cell. Perry numbers refreshed 2026-05-06 at v0.5.585 -(both default and `--fast-math` columns); other languages from -2026-04-25 at v0.5.249 (their numbers haven't moved — same compiler -versions, same hardware, re-run on demand if needed). Headline = -median ms. Full per-cell stats (median + p95 + σ + min + max) in +RUNS=11 per cell. All cells refreshed 2026-05-14 at v0.5.908 on an +otherwise-idle machine. Headline = median ms. Full per-cell stats +(median + p95 + σ + min + max) in [`polyglot/RESULTS_AUTO.md`](polyglot/RESULTS_AUTO.md) and the hand-curated [`polyglot/RESULTS.md`](polyglot/RESULTS.md). Lower is better. **`loop_overhead` and the other flag-aggressiveness probes @@ -222,10 +244,10 @@ compiler-flag probes. | Benchmark | Perry default | Perry --fast | Rust | C++ | Go | Swift | Java | Node | Bun | Python | |---------------------|--------------:|-------------:|------:|------:|------:|------:|------:|------:|------:|--------:| -| fibonacci | 304 | 304 | 330 | 315 | 451 | 406 | 282 | 1022 | 589 | 16054 | -| loop_data_dependent | 221 | 221 | 229 | 129 | 128 | 233 | 229 | 322 | 232 | 10750 | -| object_create | 2 | 0 | 0 | 0 | 0 | 0 | 5 | 11 | 6 | 164 | -| nested_loops | 17 | 17 | 8 | 8 | 10 | 8 | 11 | 18 | 21 | 484 | +| fibonacci | 309 | 306 | 316 | 309 | 446 | 401 | 278 | 987 | 518 | 12382 | +| loop_data_dependent | 225 | 224 | 226 | 129 | 128 | 225 | 226 | 226 | 230 | 6068 | +| object_create | 2 | 0 | 0 | 0 | 0 | 0 | 5 | 8 | 6 | 133 | +| nested_loops | 18 | 17 | 8 | 8 | 10 | 8 | 10 | 17 | 20 | 353 | **Reading the two Perry columns:** identical numbers (`fibonacci`, `loop_data_dependent`, `nested_loops`) mean the workload doesn't @@ -238,27 +260,29 @@ noise on a sub-3-ms cell. **The benchmarks where the gap is large sit in the "Optimization probes" table further down — that's the section the fast-math flag actually moves.** -`fibonacci` (median 304 ms, both modes): Perry matches the compiled -pack within 11-22 ms; Java's HotSpot JIT is ~7% faster from inlining -the recursive call. Identical default vs `--fast-math` because this -kernel is integer recursion, not FP arithmetic. - -`loop_data_dependent` (median 221 ms in both modes): the genuinely- -non-foldable f64 microbench (multiplicative carry through `sum` -plus array reads, 100M iters; LLVM cannot reorder under reassoc -and cannot vectorize past the sequential dependency — verified at -the asm level, see [`bench.rs`](polyglot/bench.rs#L122)). The -sequential dependency on `sum` is preserved across every language -on the row; the kernel is genuinely non-foldable. **Crucially, -this is the bench where `--fast-math` does NOTHING for Perry** -(221 ms either way) — sequential `sum * x[i] + x[j]` carries can't -be reordered no matter how permissive the FMF flags are. +`fibonacci` (median 309 ms in this sweep): Perry sits within a few +ms of Rust 316 / C++ 309 and well ahead of Bun 518 / Node 987; Java +HotSpot JIT hits 278. Default and `--fast-math` are within noise +(309 vs 306) because this kernel is integer recursion, not FP +arithmetic. + +`loop_data_dependent` (median 225 ms default / 224 `--fast-math`): +the genuinely-non-foldable f64 microbench (multiplicative carry +through `sum` plus array reads, 100M iters; LLVM cannot reorder +under reassoc and cannot vectorize past the sequential dependency +— verified at the asm level, see [`bench.rs`](polyglot/bench.rs#L122)). +The sequential dependency on `sum` is preserved across every +language on the row; the kernel is genuinely non-foldable. +**Crucially, this is the bench where `--fast-math` does NOTHING +for Perry** (225 ≈ 224 ms either way) — sequential `sum * x[i] + x[j]` +carries can't be reordered no matter how permissive the FMF flags are. **The kernel splits the field into two FP-contract clusters:** an -*FMA-contract pack* at ~128 ms (Go default, C++ `g++ -O3` on Apple -Clang — both fuse `sum * a + b` into a single `FMADDD` instruction -with one IEEE-754 rounding instead of two) and a *no-contract pack* -at 221-235 ms (Perry default AND `--fast-math`, Rust default `-O`, +*FMA-contract pack* at ~127-129 ms (Go default and C++ `clang -O3` +on Apple Clang — both fuse `sum * a + b` into a single `FMADDD` +instruction with one IEEE-754 rounding instead of two) and a +*no-contract pack* at 225-230 ms (Perry default + `--fast-math`, +Rust default `-O`, Swift `-O`, Java without `-XX:+UseFMA`, Bun) running scalar `FMUL` + `FADD`, two roundings, ~6-8 cycle dependency chain vs FMADDD's ~4. Why doesn't `--fast-math`'s `contract` flag put Perry in the @@ -271,12 +295,11 @@ clang's `on` default which permits intra-statement contraction `contract` adds) doesn't help here because every `sum * x[i] + x[j]` is one expression statement. Reaching the FMA pack would require `-ffp-contract=fast` at the linker step, which is a separate knob -not covered by `--fast-math`. Node's 322 ms is a JIT-warm-up -outlier (σ=63, p95=447); on quieter runs it lands in the -no-contract pack alongside Bun. **Net answer to "what does Perry -do on real FP work?":** competitive with the no-contract compiled -pack regardless of `--fast-math` mode; reaching the FMA-contract -pack needs a different lever entirely. +not covered by `--fast-math`. Node lands at 226 ms this sweep, +right with the no-contract pack alongside Bun (230). **Net answer +to "what does Perry do on real FP work?":** competitive with the +no-contract compiled pack regardless of `--fast-math` mode; +reaching the FMA-contract pack needs a different lever entirely. `object_create` (1M iters): median 2 ms default / 0 ms `--fast-math` — sub-3-ms cells where 1-tick differences swing the headline number; @@ -310,27 +333,29 @@ per-language flag-tuning sweep. | Benchmark | Perry default | Perry --fast | Rust | C++ | Go | Swift | Java | Node | Bun | Python | |---------------------|--------------:|-------------:|------:|------:|------:|------:|------:|------:|------:|--------:| -| loop_overhead | 95 | 12 | 98 | 98 | 98 | 143 | 100 | 54 | 46 | 3019 | -| math_intensive | 50 | 14 | 48 | 51 | 49 | 50 | 74 | 51 | 51 | 2238 | -| accumulate | 95 | 33 | 98 | 98 | 98 | 98 | 100 | 617 | 100 | 5048 | -| array_read | 11 | 11 | 9 | 9 | 11 | 9 | 12 | 13 | 16 | 342 | -| array_write | 4 | 3 | 7 | 3 | 9 | 2 | 7 | 9 | 6 | 401 | - -Perry default-column reading: `loop_overhead`, `math_intensive`, and -`accumulate` are all ~95-50 ms — dead-on the unflagged compiled pack -(Rust/Swift/Bun at 46-100 ms). That's the honest "Perry on TypeScript -arithmetic with bit-exact-Node semantics" number. `array_read` and -`array_write` are essentially mode-independent (memory-bound). +| loop_overhead | 97 | 12 | 97 | 96 | 96 | 96 | 97 | 53 | 41 | 1967 | +| math_intensive | 51 | 14 | 48 | 50 | 48 | 48 | 50 | 49 | 50 | 1579 | +| accumulate | 97 | 34 | 97 | 96 | 96 | 96 | 98 | 597 | 98 | 4382 | +| array_read | 11 | 11 | 9 | 9 | 10 | 9 | 11 | 14 | 16 | 236 | +| array_write | 3 | 4 | 7 | 2 | 9 | 2 | 6 | 9 | 6 | 331 | + +Perry default-column reading: `loop_overhead` 97 ms, `math_intensive` +51 ms, `accumulate` 97 ms — sitting with the unflagged compiled +pack (Rust 97 / 48 / 97, Bun 41 / 50 / 98). That's the honest +"Perry on TypeScript arithmetic with bit-exact-Node semantics" number. +`array_read` and `array_write` are essentially mode-independent +(memory-bound). Perry --fast-column reading: same kernels with reassoc + contract -permitted reach 12 / 14 / 33 ms. On `loop_overhead` and `accumulate`, -LLVM's IndVarSimplify rewrites `sum + 1.0 × N` as an integer -induction variable and the autovectorizer generates `<2 x double>` -parallel-accumulator reductions with interleave count 4. On -`math_intensive`, the harmonic-sum carry is associative under +permitted reach **12 / 14 / 34 ms** (v0.5.908 sweep) — within 1 ms +of the v0.5.585 historical fast-math numbers. On `loop_overhead` +and `accumulate`, LLVM's IndVarSimplify rewrites `sum + 1.0 × N` as +an integer induction variable and the autovectorizer generates +`<2 x double>` parallel-accumulator reductions with interleave count +4. On `math_intensive`, the harmonic-sum carry is associative under `reassoc`, allowing the same vectorize-and-reduce pattern. -The 7-8× speedup on `loop_overhead` is real, repeatable, and +The 8× speedup on `loop_overhead` is real, repeatable, and TypeScript-spec-conformant only because TypeScript's `number` semantics can't observe `reassoc contract` differences — no signalling NaNs, no fenv, no strict `-0` rules at the operator @@ -339,15 +364,16 @@ in [`docs/src/cli/fast-math.md`](../docs/src/cli/fast-math.md). The companion `loop_data_dependent` (in the headline table above) shows what Perry looks like on the same kind of kernel WHEN THE -COMPILER CAN'T FOLD even with permission: 221 ms, dead-on the -no-contract pack (Rust/Swift/Java/Bun 229-233 ms), regardless of -mode. The Go/C++-O3 FMA-contract pack at ~128 ms beats us on this -kernel because they fuse FMUL + FADD into FMADDD via clang's -`-ffp-contract=fast` (a separate knob `--fast-math` does NOT -toggle). A reader who treats the 12 ms `loop_overhead` number as -"Perry is 7× faster than C++" without reading this paragraph has -been misled by the headline; the honest comparison is the default -column, where Perry sits *with* the compiled pack, not above it. +COMPILER CAN'T FOLD even with permission: 225 ms default / 224 ms +`--fast-math`, dead-on the no-contract pack (Rust 226 / Bun 230 / +Node 226), regardless of mode. The Go / C++-O3 FMA-contract pack +at ~127-129 ms beats us on this kernel because they fuse FMUL + +FADD into FMADDD via clang's `-ffp-contract=fast` (a separate knob +`--fast-math` does NOT toggle). A reader who treats the 12 ms +`loop_overhead` number as "Perry is 8× faster than C++" without +reading this paragraph has been misled by the headline; the honest +comparison is the default column, where Perry sits *with* the +compiled pack, not above it. **Honest regressions / changes vs the v0.5.164 baseline:** @@ -382,6 +408,23 @@ column, where Perry sits *with* the compiled pack, not above it. identical between modes within noise — fast-math changed nothing observable on those workloads. +`v0.5.908` sweep delta vs v0.5.585 default (re-run on an idle machine): + +- `fibonacci` 304 → 309 ms (+5; within run-to-run noise σ=1.3). +- `loop_overhead` 95 → 97 ms (+2; within noise σ=0.9). +- `math_intensive` 50 → 51 ms (+1; within noise σ=2.0). +- `accumulate` 95 → 97 ms (+2; within noise σ=0.7). +- `loop_data_dependent` 221 → 225 ms (+4; within noise σ=1.7). +- `array_read` / `array_write` / `object_create` / `nested_loops` + within 1 ms of v0.5.585. + +**Yesterday's apparent regressions (332 / 67 / 111 / 21 ms on those +same cells at v0.5.891) were almost entirely parallel-cargo-build +contamination, not Perry-side regressions** — confirmed by this +clean re-run. The lone real recent change is the JSON polyglot +RSS regression filed as [#745](https://github.com/PerryTS/perry/issues/745) +and partially fixed in v0.5.900; see the JSON table above. + The trade-off was deliberate: gen-GC's wins on long-running and allocation-heavy workloads (`test_memory_json_churn` 115 → 91 MB in v0.5.237) outweigh the small compute-bench regressions, and @@ -634,18 +677,17 @@ the comparison is honest in both directions. ## 2. Compute microbenches — full data [`benchmarks/polyglot/`](polyglot/) — 10 implementations across 9 -benchmarks. **Perry cells in TL;DR's "Compute microbenches" and +benchmarks. **All cells in TL;DR's "Compute microbenches" and "Optimization probes" tables are RUNS=11 medians refreshed -2026-05-06 at v0.5.585**, run in BOTH `default` and `--fast-math` -modes following the v0.5.585 fast-math opt-in flip. Other languages' -cells are RUNS=11 medians from the 2026-04-25 polyglot run at -v0.5.249 — same compiler versions, same hardware; their numbers -shouldn't have moved, and a full polyglot rerun is on the -follow-up list but not blocking. See +2026-05-14 at v0.5.908** — both Perry columns (`default` and +`--fast-math`) and all peer languages re-measured together this +sweep, on an otherwise-idle machine. See [`RESULTS_AUTO.md`](polyglot/RESULTS_AUTO.md) for per-cell -distributions (median + p95 + σ + min + max) of the 2026-04-25 run. -The JSON polyglot tables in TL;DR §A and §B were rerun separately -and are fresh as of 2026-04-25 at v0.5.279. +distributions (median + p95 + σ + min + max) of the default run +plus the `--fast-math` addendum at the bottom. The JSON +polyglot tables in TL;DR §A and §B were rerun together at v0.5.908 +via `benchmarks/json_polyglot/run.sh`; full per-cell stats in +[`json_polyglot/RESULTS.md`](json_polyglot/RESULTS.md). ### Idiomatic flags table (current) @@ -762,34 +804,36 @@ stringify, peak RSS via `/usr/bin/time -l`). | v0.5.236 (C4b-δ-tune, ceiling) | 107 | 358 | trigger ceiling stops step doubling past 64 MB | | v0.5.237 (gen-gc default ON) | 102 | 372 | minor GC fires by default | | v0.5.241 (best-of-5 min) | 102 | 375 | unchanged from v0.5.237; last best-of-5 row | -| **v0.5.279 (current, RUNS=11 median)** | **102** | **382** | RUNS=11 median (p95=389, σ=3.9, [377..389]) | +| v0.5.279 (RUNS=11 median) | 102 | 382 | RUNS=11 median (p95=389, σ=3.9, [377..389]) | +| v0.5.891 (peak regression) | 269 | 306 | #745 trigger-ratchet bug — RSS +167 MB vs v0.5.279 | +| **v0.5.908 (current, RUNS=11 median)** | **283** | **338** | post-#745 partial fix (v0.5.900); RSS still ~2.8× v0.5.279 floor | Default (lazy + gen-gc), the case `bench_json_roundtrip` measures with -no env vars: **70 ms median / 85 MB peak RSS** (RUNS=11; p95=73, σ=1.1, -[69..73]). On this specific workload (parse + stringify, no -intermediate iteration), faster than every other TypeScript-input -runtime measured here (Node, Bun); slower than simdjson (C++ + SIMD, -the parse-throughput ceiling). See TL;DR §A for the full table and -the workload caveats — the lazy tape's win is workload-specific, and -this is the workload it was designed for. - -The 70 ms here matches TL;DR §A's `perry (gen-gc + lazy tape)` row -within run-to-run noise (75 ms median in §A's 11-run sample, σ=6.9). -Both numbers come from the same workload on the same v0.5.279 binary; -the 5 ms gap is the difference between two independent RUNS=11 -samples, and is well inside the σ envelope. +no env vars on this sweep: **83 ms median / 227 MB peak RSS** (RUNS=11; +p95=86, σ=1.4, [81..86]). Wall-time is back to v0.5.279 levels (was 75 ms) +and still faster than every other TypeScript-input runtime measured here +(Node 377 ms, Bun 249 ms); slower than simdjson (24 ms, C++ + SIMD +parse-throughput ceiling). See TL;DR §A for the full table and the +workload caveats — the lazy tape's win is workload-specific, and this +is the workload it was designed for. **The 85 MB → 227 MB RSS gap** +vs v0.5.279 narrowed from yesterday's 254 MB but remains real; the +v0.5.900 fix closed ~30% of the regression on roundtrip and ~50% on +parse-and-iterate. Residual gap tracked on +[#745](https://github.com/PerryTS/perry/issues/745). ### Other Perry benches (RUNS=11, M1 Max, taskpolicy -t 0 -l 0) Median + p95 + σ + min + max wall-clock ms, worst-observed peak RSS — -the same methodology used by TL;DR §A and §B. Refreshed 2026-04-25 -at v0.5.279 using the same `compute_stats` awk routine as -[`json_polyglot/run.sh`](json_polyglot/run.sh) over each suite binary -in [`benchmarks/suite/`](suite/). All rows here measure JSON, GC, or -integer/cache work — none are FP-arithmetic-sensitive, so the -v0.5.585 fast-math opt-in flip doesn't move them; rerunning is on -the followup list but the gap is below the noise floor for the -workloads listed. +the same methodology used by TL;DR §A and §B. Last full RUNS=11 +refresh was 2026-04-25 at v0.5.279 (rows below); a v0.5.908 single-run +refresh via `benchmarks/suite/run_benchmarks.sh` (factorial 107 ms, +method_calls 9 ms, closure 50 ms, binary_trees 2 ms, prime_sieve 3 ms, +mandelbrot 28 ms, matrix_multiply 28 ms — see top-level +[`README.md`](../README.md) "vs Node.js and Bun" section) is the +freshest signal. The RUNS=11 cells below are due for a re-sweep; in +the meantime, the `bench_json_roundtrip` (default) row is superseded +by TL;DR §A's `perry (gen-gc + lazy tape)` cell at 83 ms / 227 MB +peak RSS on the 2026-05-14 sweep. | Benchmark | Median (ms) | p95 (ms) | σ | Min | Max | Peak RSS (MB) | |---|---:|---:|---:|---:|---:|---:| @@ -820,19 +864,19 @@ Where Perry actually wins, and a one-line "why" per item. - **JSON validate-and-roundtrip — best in dynamic-typing pack** (parse → stringify, no intermediate iteration). Perry lands at - **75 ms** median (TL;DR §A) — faster than every other - dynamic-typing runtime in the table: Bun 259 ms, Node 394 ms, - Kotlin server JIT 453 ms. simdjson leads - the absolute time at 24 ms — that's the SIMD-accelerated C++ - reference, listed alongside nlohmann/json so the comparison is - honest in both directions. Perry's win in the dynamic-typing - cohort comes from the lazy JSON tape (v0.5.204+): parse builds - a 12-byte-per-value tape instead of materializing a tree; - stringify on an unmutated parse memcpy's the original blob — - same fast-path trick simdjson uses with `raw_json()`. See + **83 ms** median (TL;DR §A, 2026-05-14 / v0.5.908) — faster than + every other dynamic-typing runtime in the table: Bun 249 ms, + Node 377 ms, Kotlin server JIT 457 ms. simdjson leads the absolute + time at 24 ms — that's the SIMD-accelerated C++ reference, listed + alongside nlohmann/json so the comparison is honest in both + directions. Perry's win in the dynamic-typing cohort comes from + the lazy JSON tape (v0.5.204+): parse builds a 12-byte-per-value + tape instead of materializing a tree; stringify on an unmutated + parse memcpy's the original blob — same fast-path trick simdjson + uses with `raw_json()`. See [`json-typed-parse-plan.md`](../docs/json-typed-parse-plan.md). On parse-and-iterate (TL;DR §B), Perry doesn't lead — simdjson - at 24 ms and Rust serde_json at 183 ms both beat Perry's 466 ms, + at 24 ms and Rust serde_json at 182 ms both beat Perry's 425 ms, and Perry's lazy tape pays overhead it can't amortize when every element is touched. - **Release-mode defaults expose LLVM optimizations that strict-IEEE @@ -848,9 +892,9 @@ Where Perry actually wins, and a one-line "why" per item. pipeline. On [`loop_data_dependent`](polyglot/bench.rs#L122) — the genuinely-non-foldable f64 kernel where the compiler *can't* fold - the loop body away — Perry lands at **235 ms median**, dead in - the no-contract compiled-pack cluster (Rust 229, Swift 233, - Java 229, Bun 232; the FMA-contract pack of Go 128 / C++ `-O3` + the loop body away — Perry lands at **225 ms median**, dead in + the no-contract compiled-pack cluster (Rust 226, Bun 230, Node 226, + Swift 225, Java 226; the FMA-contract pack of Go 128 / C++ `-O3` Apple Clang 129 wins this kernel by fusing FMUL+FADD into FMADDD, which LLVM matches under `-ffp-contract=fast`). The larger gaps Perry shows on `loop_overhead` / `math_intensive` / `accumulate` diff --git a/benchmarks/honest_bench/REPORT.md b/benchmarks/honest_bench/REPORT.md index 0f36b0a87..887d0ab12 100644 --- a/benchmarks/honest_bench/REPORT.md +++ b/benchmarks/honest_bench/REPORT.md @@ -1,21 +1,23 @@ # Perry vs Rust vs Zig — honest benchmark results -Numbers are measured against Perry v0.5.495 on five implementations: Rust, Zig, Perry, Node.js, Bun. All three workloads complete on all five implementations — every correctness and scaling bug the bench originally surfaced (`#38`–`#53`, `#62`–`#65`) has landed in Perry mainline. Data tables below are auto-regenerated from `results/results.json`; the bottom-line summary is hand-written and tracks the most recent sweep. +Numbers are measured against Perry v0.5.908 on five implementations: Rust, Zig, Perry, Node.js, Bun. All three workloads complete on all five implementations and every measured run's output matches the Bun reference byte-for-byte (300/300 rows; correctness gate from `#441`). The auto-generated tables below come straight from `results/results.json`; the bottom-line summary tracks the most recent sweep. ## Bottom line -- **Compute (image convolution, tight loop, minimal heap):** Zig 247 ms. - **Perry 377 ms (1.52× Zig) — still ahead of Rust's 414 ms**, 2.5× faster - than Bun, 3.4× faster than Node. The v0.5.495 static-trip-count for-loop - unroll + i32 init/shadow path landings closed most of the previous gap - (~470 ms → 377 ms post-unroll). -- **Allocation-heavy (JSON pipeline, 100 records):** Rust 42 ms, Zig 43 ms, - **Perry 47 ms (1.10× the fastest) — ahead of Bun's 65 ms and Node's 174 ms**, - at 3 MB RSS vs Bun's 11 MB and Node's 36 MB. -- **JSON at scale (500k records, 108 MB):** Rust 738 ms, Bun 739 ms, Zig - 982 ms, Node 1191 ms, **Perry 1188 ms**. Perry matches Node and trails - Rust/Bun by ~1.6× — but completes; as recently as v0.5.68 this workload - hung >13 min CPU without finishing (`#65`, now closed). +- **Compute (image convolution, tight loop, minimal heap):** Zig 245 ms. + **Perry 354 ms (1.44× Zig) — ahead of Rust's 392 ms**, 2.6× faster + than Bun (915 ms), 3.4× faster than Node (1207 ms). Slight improvement + vs yesterday's v0.5.891 (365 → 354 ms); the bulk of the original arc + (2261 ms → ~377 ms, ~6×) landed during the v0.5.30–v0.5.495 perf sprint. +- **Allocation-heavy (JSON pipeline, 100 records):** Zig 35 ms, Rust 34 ms, + **Perry 39 ms (1.15× the fastest) — ahead of Bun's 51 ms and Node's 144 ms**, + at ~3 MB RSS vs Bun's 11 MB and Node's 36 MB. Stable vs v0.5.891. +- **JSON at scale (500k records, 108 MB):** Rust 608 ms, Bun 650 ms, Zig + 867 ms, Node 966 ms, **Perry 1098 ms**. Perry trails Rust/Bun by ~1.7×, + beats Node by 9%, and uses 731 MB peak RSS. The workload completes + reliably — as recently as v0.5.68 this hung >13 min CPU without + finishing (`#65`, now closed). Improved from v0.5.891's 1155 ms (-57 ms) + thanks in part to the v0.5.900 GC fix for #745. - **Binary size:** Zig smallest (~230 KB), Rust next (~300–380 KB), Perry (~550–700 KB, including GC + Node-compat shims). Node/Bun don't have standalone binaries — they require their runtime installed separately. @@ -37,10 +39,10 @@ Charts: [image convolution](charts/image_convolution.png), | OS | macOS 26.4 (Darwin) | | Rust | `rustc 1.94.1 (e408947bf 2026-03-25)` | | Zig | `0.15.2` | -| Perry | `perry 0.5.495` | -| Python | `Python 3.14.3` | -| Runs | 2 warmup + 5 measured, median reported | -| Generated | 2026-05-04T08:54:24.219226+00:00 | +| Perry | `perry 0.5.908` | +| Python | `Python 3.14.4` | +| Runs | 5 warmup + 20 measured, median reported | +| Generated | 2026-05-14T07:44:59.755910+00:00 | ## 3. Image convolution (5×5 Gaussian, 3840×2160 RGB) @@ -48,13 +50,13 @@ _In-memory input + output checksum (no PPM I/O) — see the workload README for | Language | Wall median (ms) | Wall σ | Peak RSS | Binary size | Source LoC | Runs OK | |---|---:|---:|---:|---:|---:|---:| -| rust | 414.2 | 34.8 | 48.5 MB | 295.5 KB | 112 | 5/5 | -| zig | 247.4 | 1.3 | 48.5 MB | 226.9 KB | 113 | 5/5 | -| perry | 376.6 | 4.9 | 49.9 MB | 717.6 KB | 92 | 5/5 | -| node | 1,287.8 | 41.8 | 86.0 MB | — | 86 | 5/5 | -| bun | 948.9 | 27.3 | 59.9 MB | — | 86 | 5/5 | +| rust | 392.1 | 3.8 | 48.5 MB | 295.5 KB | 112 | 20/20 | +| zig | 245.4 | 6.2 | 48.5 MB | 227.0 KB | 113 | 20/20 | +| perry | 354.0 | 2.3 | 49.9 MB | 966.6 KB | 92 | 20/20 | +| node | 1,206.6 | 22.0 | 86.5 MB | — | 86 | 20/20 | +| bun | 915.4 | 35.2 | 60.0 MB | — | 86 | 20/20 | -_Ratios vs fastest: rust = 1.67×, zig = 1.00×, perry = 1.52×, node = 5.20×, bun = 3.84×_ +_Ratios vs fastest: rust = 1.60×, zig = 1.00×, perry = 1.44×, node = 4.92×, bun = 3.73×_ ## 1a. JSON pipeline — small fixture (100 records, 21 KB) @@ -62,27 +64,27 @@ _All three languages produce byte-identical output at this scale (hash `7fc66fa8 | Language | Wall median (ms) | Wall σ | Peak RSS | Binary size | Source LoC | Runs OK | |---|---:|---:|---:|---:|---:|---:| -| rust | 42.3 | 5.3 | 1.2 MB | 376.3 KB | 99 | 5/5 | -| zig | 42.5 | 6.6 | 1.5 MB | 309.0 KB | 112 | 5/5 | -| perry | 46.6 | 5.0 | 3.1 MB | 816.4 KB | 52 | 5/5 | -| node | 174.0 | 18.9 | 36.1 MB | — | 40 | 5/5 | -| bun | 65.4 | 5.7 | 10.7 MB | — | 40 | 5/5 | +| rust | 34.1 | 1.1 | 1.2 MB | 376.3 KB | 99 | 20/20 | +| zig | 34.5 | 1.1 | 1.5 MB | 309.1 KB | 112 | 20/20 | +| perry | 39.2 | 1.2 | 3.5 MB | 1.0 MB | 52 | 20/20 | +| node | 143.6 | 1.8 | 36.1 MB | — | 40 | 20/20 | +| bun | 51.1 | 1.4 | 10.6 MB | — | 40 | 20/20 | -_Ratios vs fastest: rust = 1.00×, zig = 1.01×, perry = 1.10×, node = 4.11×, bun = 1.55×_ +_Ratios vs fastest: rust = 1.00×, zig = 1.01×, perry = 1.15×, node = 4.21×, bun = 1.50×_ ## 1b. JSON pipeline — full fixture (500k records, 108 MB) -_All five implementations complete this workload against the same 108 MB fixture and produce the same hash `b7e8a588`. Perry completes in ~1.6 s, ~2.7× the leader (Rust / Bun); as recently as v0.5.68 this workload hung >13 minutes without finishing (`#65`, now closed)._ +_All five implementations complete this workload against the same 108 MB fixture and produce the same hash `b7e8a588`. Perry completes in ~1.1 s, ~1.8× the leader (Rust); as recently as v0.5.68 this workload hung >13 minutes without finishing (`#65`, now closed)._ | Language | Wall median (ms) | Wall σ | Peak RSS | Binary size | Source LoC | Runs OK | |---|---:|---:|---:|---:|---:|---:| -| rust | 738.5 | 73.8 | 432.0 MB | 376.3 KB | 99 | 5/5 | -| zig | 981.9 | 19.8 | 576.7 MB | 309.0 KB | 112 | 5/5 | -| perry | 1,188.1 | 36.9 | 720.3 MB | 816.4 KB | 52 | 5/5 | -| node | 1,191.3 | 125.7 | 880.2 MB | — | 40 | 5/5 | -| bun | 739.1 | 19.5 | 593.0 MB | — | 40 | 5/5 | +| rust | 608.3 | 13.0 | 430.6 MB | 376.3 KB | 99 | 20/20 | +| zig | 867.4 | 19.4 | 576.8 MB | 309.1 KB | 112 | 20/20 | +| perry | 1,098.4 | 9.4 | 731.0 MB | 1.0 MB | 52 | 20/20 | +| node | 966.3 | 9.8 | 880.0 MB | — | 40 | 20/20 | +| bun | 649.9 | 14.7 | 593.7 MB | — | 40 | 20/20 | -_Ratios vs fastest: rust = 1.00×, zig = 1.33×, perry = 1.61×, node = 1.61×, bun = 1.00×_ +_Ratios vs fastest: rust = 1.00×, zig = 1.43×, perry = 1.81×, node = 1.59×, bun = 1.07×_ ## Honest findings — Perry gaps surfaced by this benchmark diff --git a/benchmarks/honest_bench/charts/image_convolution.png b/benchmarks/honest_bench/charts/image_convolution.png index 4a65d24ee..06ed57bf2 100644 Binary files a/benchmarks/honest_bench/charts/image_convolution.png and b/benchmarks/honest_bench/charts/image_convolution.png differ diff --git a/benchmarks/honest_bench/charts/json_pipeline_full.png b/benchmarks/honest_bench/charts/json_pipeline_full.png index 9d0e998a9..7d24ec203 100644 Binary files a/benchmarks/honest_bench/charts/json_pipeline_full.png and b/benchmarks/honest_bench/charts/json_pipeline_full.png differ diff --git a/benchmarks/honest_bench/charts/json_pipeline_small.png b/benchmarks/honest_bench/charts/json_pipeline_small.png index a2f3e1993..ef623d6b9 100644 Binary files a/benchmarks/honest_bench/charts/json_pipeline_small.png and b/benchmarks/honest_bench/charts/json_pipeline_small.png differ diff --git a/benchmarks/honest_bench/results/metadata.json b/benchmarks/honest_bench/results/metadata.json index 8ae1cdfe4..3d9673cc1 100644 --- a/benchmarks/honest_bench/results/metadata.json +++ b/benchmarks/honest_bench/results/metadata.json @@ -1,8 +1,8 @@ { - "generated_at": "2026-05-04T08:54:24.219226+00:00", + "generated_at": "2026-05-14T07:44:59.755910+00:00", "host": { "os_version": "26.4", - "kernel": "Darwin MacBookPro.fritz.box 25.4.0 Darwin Kernel Version 25.4.0: Thu Mar 19 19:30:44 PDT 2026; root:xnu-12377.101.15~1/RELEASE_ARM64_T6000 arm64", + "kernel": "Darwin MacBook-Pro-69.local 25.4.0 Darwin Kernel Version 25.4.0: Thu Mar 19 19:30:44 PDT 2026; root:xnu-12377.101.15~1/RELEASE_ARM64_T6000 arm64", "arch": "arm64", "cpu": "Apple M1 Max", "ncpu": "10", @@ -12,11 +12,11 @@ "rustc": "rustc 1.94.1 (e408947bf 2026-03-25)", "cargo": "cargo 1.94.1 (29ea6fb6a 2026-03-24)", "zig": "0.15.2", - "python": "Python 3.14.3", - "perry": "perry 0.5.495" + "python": "Python 3.14.4", + "perry": "perry 0.5.908" }, "harness": { - "warmup": 2, - "measured": 5 + "warmup": 5, + "measured": 20 } } diff --git a/benchmarks/honest_bench/results/results.json b/benchmarks/honest_bench/results/results.json index a681ef457..2933e5f53 100644 --- a/benchmarks/honest_bench/results/results.json +++ b/benchmarks/honest_bench/results/results.json @@ -3,827 +3,3902 @@ { "workload": "image_convolution", "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", "run": 1, - "wall_ms": 411.737916, + "wall_ms": 393.145542, "max_rss_kb": 49696, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", "run": 2, - "wall_ms": 490.978833, + "wall_ms": 399.731458, "max_rss_kb": 49696, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", "run": 3, - "wall_ms": 424.140042, + "wall_ms": 400.096792, "max_rss_kb": 49696, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", "run": 4, - "wall_ms": 407.547417, + "wall_ms": 390.64325, "max_rss_kb": 49696, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", "run": 5, - "wall_ms": 414.195083, + "wall_ms": 399.162125, "max_rss_kb": 49696, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 6, + "wall_ms": 398.947875, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 7, + "wall_ms": 392.447417, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 8, + "wall_ms": 394.653375, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 9, + "wall_ms": 393.478792, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 10, + "wall_ms": 391.702916, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 11, + "wall_ms": 391.024042, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 12, + "wall_ms": 389.562375, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 13, + "wall_ms": 389.620667, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 14, + "wall_ms": 389.962917, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 15, + "wall_ms": 394.127417, + "max_rss_kb": 49680, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 16, + "wall_ms": 396.695875, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 17, + "wall_ms": 390.569458, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 18, + "wall_ms": 389.399166, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 19, + "wall_ms": 389.244166, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/rust/target/release/image_conv", + "run": 20, + "wall_ms": 390.338, + "max_rss_kb": 49696, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", "run": 1, - "wall_ms": 246.825375, + "wall_ms": 243.609125, "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", "run": 2, - "wall_ms": 246.932125, - "max_rss_kb": 49648, + "wall_ms": 245.780417, + "max_rss_kb": 49632, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", "run": 3, - "wall_ms": 249.934958, + "wall_ms": 249.363, "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", "run": 4, - "wall_ms": 247.431958, + "wall_ms": 244.298041, "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", "run": 5, - "wall_ms": 247.83825, + "wall_ms": 268.891042, + "max_rss_kb": 49648, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 6, + "wall_ms": 241.854417, "max_rss_kb": 49632, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", - "run": 1, - "wall_ms": 365.913958, - "max_rss_kb": 51120, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 7, + "wall_ms": 240.314875, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", - "run": 2, - "wall_ms": 377.113916, - "max_rss_kb": 51152, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 8, + "wall_ms": 241.26875, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", - "run": 3, - "wall_ms": 377.4365, - "max_rss_kb": 51120, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 9, + "wall_ms": 247.123666, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", - "run": 4, - "wall_ms": 376.597292, - "max_rss_kb": 51136, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 10, + "wall_ms": 241.813292, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", - "run": 5, - "wall_ms": 375.563125, - "max_rss_kb": 51152, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 11, + "wall_ms": 244.244292, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "node", - "binary": "node", - "run": 1, - "wall_ms": 1291.572208, - "max_rss_kb": 90162, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 12, + "wall_ms": 241.267375, + "max_rss_kb": 49632, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "node", - "binary": "node", - "run": 2, - "wall_ms": 1287.836125, - "max_rss_kb": 88066, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 13, + "wall_ms": 245.117666, + "max_rss_kb": 49632, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "node", - "binary": "node", - "run": 3, - "wall_ms": 1236.968416, - "max_rss_kb": 87122, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 14, + "wall_ms": 247.102291, + "max_rss_kb": 49632, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "node", - "binary": "node", - "run": 4, - "wall_ms": 1228.831208, - "max_rss_kb": 90242, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 15, + "wall_ms": 244.966333, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "node", - "binary": "node", - "run": 5, - "wall_ms": 1329.56975, - "max_rss_kb": 86978, + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 16, + "wall_ms": 246.73175, + "max_rss_kb": 49648, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "bun", - "binary": "bun", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 17, + "wall_ms": 248.459209, + "max_rss_kb": 49632, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 18, + "wall_ms": 250.455833, + "max_rss_kb": 49632, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 19, + "wall_ms": 249.686875, + "max_rss_kb": 49648, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/zig/zig-out/bin/image_conv", + "run": 20, + "wall_ms": 251.848959, + "max_rss_kb": 49648, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", "run": 1, - "wall_ms": 924.419708, - "max_rss_kb": 61344, + "wall_ms": 353.905792, + "max_rss_kb": 51120, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "bun", - "binary": "bun", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", "run": 2, - "wall_ms": 986.156459, - "max_rss_kb": 61424, + "wall_ms": 352.935666, + "max_rss_kb": 51120, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "bun", - "binary": "bun", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", "run": 3, - "wall_ms": 937.04425, - "max_rss_kb": 61296, + "wall_ms": 354.9005, + "max_rss_kb": 51152, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "bun", - "binary": "bun", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", "run": 4, - "wall_ms": 981.905125, - "max_rss_kb": 61264, + "wall_ms": 357.990375, + "max_rss_kb": 51152, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { "workload": "image_convolution", - "language": "bun", - "binary": "bun", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", "run": 5, - "wall_ms": 948.936125, - "max_rss_kb": 61696, + "wall_ms": 357.113875, + "max_rss_kb": 51120, "exit_code": 0, "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", - "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200" + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 1, - "wall_ms": 34.768958, - "max_rss_kb": 1184, + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 6, + "wall_ms": 358.15725, + "max_rss_kb": 51120, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 2, - "wall_ms": 42.31, - "max_rss_kb": 1216, + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 7, + "wall_ms": 353.61225, + "max_rss_kb": 51168, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 3, - "wall_ms": 45.883208, - "max_rss_kb": 1168, + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 8, + "wall_ms": 352.534125, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 9, + "wall_ms": 357.191709, + "max_rss_kb": 51152, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 10, + "wall_ms": 353.946, + "max_rss_kb": 51152, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 11, + "wall_ms": 350.160959, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 12, + "wall_ms": 354.893334, + "max_rss_kb": 51136, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 13, + "wall_ms": 353.3355, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 14, + "wall_ms": 355.724917, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 15, + "wall_ms": 355.270875, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 16, + "wall_ms": 350.367584, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 17, + "wall_ms": 354.485458, + "max_rss_kb": 51168, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 18, + "wall_ms": 352.368583, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 19, + "wall_ms": 354.07075, + "max_rss_kb": 51152, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/3_image_convolution/perry/image_conv", + "run": 20, + "wall_ms": 350.738875, + "max_rss_kb": 51120, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 1, + "wall_ms": 1206.10775, + "max_rss_kb": 87090, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 2, + "wall_ms": 1212.712583, + "max_rss_kb": 90658, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 3, + "wall_ms": 1205.088583, + "max_rss_kb": 87266, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 4, + "wall_ms": 1210.553416, + "max_rss_kb": 87410, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 5, + "wall_ms": 1202.203375, + "max_rss_kb": 88578, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 6, + "wall_ms": 1213.827875, + "max_rss_kb": 90034, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 7, + "wall_ms": 1211.120958, + "max_rss_kb": 87138, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 8, + "wall_ms": 1205.231958, + "max_rss_kb": 90594, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 9, + "wall_ms": 1209.958959, + "max_rss_kb": 87122, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 10, + "wall_ms": 1207.029875, + "max_rss_kb": 90626, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 11, + "wall_ms": 1207.174208, + "max_rss_kb": 88594, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 12, + "wall_ms": 1217.714416, + "max_rss_kb": 90402, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 13, + "wall_ms": 1302.91025, + "max_rss_kb": 87410, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 14, + "wall_ms": 1200.852625, + "max_rss_kb": 87234, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 15, + "wall_ms": 1206.205083, + "max_rss_kb": 87330, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 16, + "wall_ms": 1215.850292, + "max_rss_kb": 90610, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 17, + "wall_ms": 1197.882291, + "max_rss_kb": 90354, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 18, + "wall_ms": 1202.314584, + "max_rss_kb": 89074, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 19, + "wall_ms": 1205.347667, + "max_rss_kb": 88610, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "node", + "binary": "node", + "run": 20, + "wall_ms": 1201.450417, + "max_rss_kb": 88546, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 1, + "wall_ms": 977.446, + "max_rss_kb": 61648, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 2, + "wall_ms": 885.194667, + "max_rss_kb": 61504, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 3, + "wall_ms": 882.944083, + "max_rss_kb": 61440, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 4, + "wall_ms": 916.662791, + "max_rss_kb": 61392, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 5, + "wall_ms": 879.058958, + "max_rss_kb": 61568, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 6, + "wall_ms": 914.18375, + "max_rss_kb": 61472, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 7, + "wall_ms": 939.630125, + "max_rss_kb": 61760, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 8, + "wall_ms": 921.808083, + "max_rss_kb": 61472, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 9, + "wall_ms": 996.723708, + "max_rss_kb": 62256, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 10, + "wall_ms": 912.272917, + "max_rss_kb": 61456, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 11, + "wall_ms": 876.330292, + "max_rss_kb": 61456, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 12, + "wall_ms": 916.768333, + "max_rss_kb": 61712, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 13, + "wall_ms": 910.497875, + "max_rss_kb": 61392, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 14, + "wall_ms": 883.137125, + "max_rss_kb": 61744, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 15, + "wall_ms": 913.648917, + "max_rss_kb": 61456, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 16, + "wall_ms": 923.645208, + "max_rss_kb": 61760, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 17, + "wall_ms": 931.416667, + "max_rss_kb": 61328, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 18, + "wall_ms": 997.125042, + "max_rss_kb": 62032, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 19, + "wall_ms": 911.519041, + "max_rss_kb": 61360, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "image_convolution", + "language": "bun", + "binary": "bun", + "run": 20, + "wall_ms": 919.470709, + "max_rss_kb": 61616, + "exit_code": 0, + "stdout_first": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "stdout_last": "checksum=2ba2e053 dims=3840x2160 bytes=24883200", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 1, + "wall_ms": 34.952917, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 2, + "wall_ms": 34.2765, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 3, + "wall_ms": 36.259458, + "max_rss_kb": 1168, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 4, + "wall_ms": 34.075375, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 5, + "wall_ms": 33.190083, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 6, + "wall_ms": 35.027416, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 7, + "wall_ms": 35.046708, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 8, + "wall_ms": 32.711709, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 9, + "wall_ms": 33.6715, + "max_rss_kb": 1168, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 10, + "wall_ms": 33.941083, + "max_rss_kb": 1168, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 11, + "wall_ms": 32.825083, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 12, + "wall_ms": 33.327042, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 13, + "wall_ms": 33.789958, + "max_rss_kb": 1168, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 14, + "wall_ms": 34.544792, + "max_rss_kb": 1168, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 15, + "wall_ms": 36.450709, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 16, + "wall_ms": 34.217875, + "max_rss_kb": 1168, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 17, + "wall_ms": 33.518084, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 18, + "wall_ms": 34.189833, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 19, + "wall_ms": 35.79525, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 20, + "wall_ms": 33.690208, + "max_rss_kb": 1184, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 1, + "wall_ms": 32.702084, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 2, + "wall_ms": 32.95725, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 3, + "wall_ms": 35.187042, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 4, + "wall_ms": 34.697709, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 5, + "wall_ms": 32.767709, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 6, + "wall_ms": 34.482292, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 7, + "wall_ms": 33.74825, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 8, + "wall_ms": 32.675959, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 9, + "wall_ms": 32.843584, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 10, + "wall_ms": 34.443583, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 11, + "wall_ms": 34.460292, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 12, + "wall_ms": 37.253334, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 13, + "wall_ms": 34.396792, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 14, + "wall_ms": 35.454459, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 15, + "wall_ms": 34.475125, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 16, + "wall_ms": 34.593709, + "max_rss_kb": 1536, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 17, + "wall_ms": 33.509041, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 18, + "wall_ms": 34.916417, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 19, + "wall_ms": 34.8765, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 20, + "wall_ms": 34.490917, + "max_rss_kb": 1520, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 1, + "wall_ms": 38.32375, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 2, + "wall_ms": 39.518875, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 3, + "wall_ms": 40.58725, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 4, + "wall_ms": 38.416333, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 5, + "wall_ms": 37.675625, + "max_rss_kb": 3664, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 6, + "wall_ms": 38.730541, + "max_rss_kb": 3648, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 7, + "wall_ms": 38.265375, + "max_rss_kb": 3648, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 8, + "wall_ms": 38.861875, + "max_rss_kb": 3648, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 9, + "wall_ms": 39.309917, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 10, + "wall_ms": 39.232834, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 11, + "wall_ms": 39.7595, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 12, + "wall_ms": 43.094833, + "max_rss_kb": 3648, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 13, + "wall_ms": 39.386041, + "max_rss_kb": 3648, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 14, + "wall_ms": 39.651083, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 15, + "wall_ms": 39.739958, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 16, + "wall_ms": 38.731791, + "max_rss_kb": 3648, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 17, + "wall_ms": 38.625459, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 18, + "wall_ms": 37.813625, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 19, + "wall_ms": 41.030292, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 20, + "wall_ms": 39.108709, + "max_rss_kb": 3632, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 1, + "wall_ms": 145.082458, + "max_rss_kb": 39314, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 2, + "wall_ms": 143.340833, + "max_rss_kb": 36754, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 3, + "wall_ms": 144.099417, + "max_rss_kb": 35682, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 4, + "wall_ms": 142.78675, + "max_rss_kb": 37810, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 5, + "wall_ms": 142.080334, + "max_rss_kb": 36370, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 6, + "wall_ms": 143.064667, + "max_rss_kb": 35810, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 7, + "wall_ms": 143.203833, + "max_rss_kb": 37746, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 8, + "wall_ms": 144.196208, + "max_rss_kb": 36050, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 9, + "wall_ms": 145.091417, + "max_rss_kb": 36146, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 10, + "wall_ms": 149.108625, + "max_rss_kb": 37730, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 11, + "wall_ms": 143.919375, + "max_rss_kb": 36098, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 12, + "wall_ms": 144.761667, + "max_rss_kb": 37906, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 13, + "wall_ms": 144.837333, + "max_rss_kb": 37906, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 14, + "wall_ms": 143.857375, + "max_rss_kb": 37585, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 15, + "wall_ms": 141.493333, + "max_rss_kb": 36866, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 16, + "wall_ms": 142.255083, + "max_rss_kb": 36114, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 17, + "wall_ms": 141.976166, + "max_rss_kb": 38913, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 18, + "wall_ms": 143.825708, + "max_rss_kb": 35970, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 19, + "wall_ms": 140.390125, + "max_rss_kb": 37122, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "node", + "binary": "node", + "run": 20, + "wall_ms": 143.354083, + "max_rss_kb": 37842, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 1, + "wall_ms": 49.903875, + "max_rss_kb": 10832, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 2, + "wall_ms": 51.3185, + "max_rss_kb": 10848, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 3, + "wall_ms": 51.658417, + "max_rss_kb": 10816, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 4, + "wall_ms": 51.989667, + "max_rss_kb": 10800, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 5, + "wall_ms": 49.75, + "max_rss_kb": 10816, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 6, + "wall_ms": 52.267292, + "max_rss_kb": 10864, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 7, + "wall_ms": 50.136416, + "max_rss_kb": 10800, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 8, + "wall_ms": 51.464542, + "max_rss_kb": 10832, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 9, + "wall_ms": 49.678125, + "max_rss_kb": 10880, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 10, + "wall_ms": 49.480833, + "max_rss_kb": 10832, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 11, + "wall_ms": 49.999458, + "max_rss_kb": 10864, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 12, + "wall_ms": 53.987, + "max_rss_kb": 10832, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 13, + "wall_ms": 50.086625, + "max_rss_kb": 10880, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 14, + "wall_ms": 51.824916, + "max_rss_kb": 10848, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 15, + "wall_ms": 51.8455, + "max_rss_kb": 10832, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 16, + "wall_ms": 52.428583, + "max_rss_kb": 10880, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 17, + "wall_ms": 53.90225, + "max_rss_kb": 10928, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 18, + "wall_ms": 49.00075, + "max_rss_kb": 10816, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 19, + "wall_ms": 50.662875, + "max_rss_kb": 10816, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_small", + "language": "bun", + "binary": "bun", + "run": 20, + "wall_ms": 50.818208, + "max_rss_kb": 10800, + "exit_code": 0, + "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 1, + "wall_ms": 601.8995, + "max_rss_kb": 442352, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 2, + "wall_ms": 602.069167, + "max_rss_kb": 438720, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 3, + "wall_ms": 605.726, + "max_rss_kb": 440912, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 4, + "wall_ms": 609.582209, + "max_rss_kb": 438336, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 5, + "wall_ms": 660.508334, + "max_rss_kb": 442656, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 6, + "wall_ms": 607.789875, + "max_rss_kb": 440896, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 7, + "wall_ms": 608.638291, + "max_rss_kb": 442672, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 8, + "wall_ms": 610.796208, + "max_rss_kb": 442336, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 9, + "wall_ms": 599.539584, + "max_rss_kb": 442672, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 10, + "wall_ms": 607.225125, + "max_rss_kb": 440880, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 11, + "wall_ms": 602.323208, + "max_rss_kb": 442672, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 12, + "wall_ms": 611.593584, + "max_rss_kb": 440896, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 13, + "wall_ms": 612.353416, + "max_rss_kb": 438704, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 14, + "wall_ms": 607.287, + "max_rss_kb": 442672, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 15, + "wall_ms": 621.74625, + "max_rss_kb": 442400, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 16, + "wall_ms": 621.437833, + "max_rss_kb": 438704, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 17, + "wall_ms": 607.873708, + "max_rss_kb": 442352, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 18, + "wall_ms": 608.823792, + "max_rss_kb": 440928, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 19, + "wall_ms": 612.654292, + "max_rss_kb": 438432, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "rust", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", + "run": 20, + "wall_ms": 603.127417, + "max_rss_kb": 436960, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 1, + "wall_ms": 921.030208, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 2, + "wall_ms": 860.017666, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 3, + "wall_ms": 863.431666, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 4, + "wall_ms": 870.846875, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 5, + "wall_ms": 875.882416, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 6, + "wall_ms": 868.164917, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 7, + "wall_ms": 870.474375, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 8, + "wall_ms": 932.23875, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 9, + "wall_ms": 864.806708, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 10, + "wall_ms": 862.333083, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 11, + "wall_ms": 865.232209, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 12, + "wall_ms": 872.025042, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 13, + "wall_ms": 868.595417, + "max_rss_kb": 590608, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 14, + "wall_ms": 863.729042, + "max_rss_kb": 590592, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 15, + "wall_ms": 865.995625, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 16, + "wall_ms": 868.087834, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 17, + "wall_ms": 865.841083, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 18, + "wall_ms": 866.776833, + "max_rss_kb": 590592, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 19, + "wall_ms": 866.140667, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "zig", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "run": 20, + "wall_ms": 895.654292, + "max_rss_kb": 590624, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 1, + "wall_ms": 1091.640917, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 2, + "wall_ms": 1100.503541, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 3, + "wall_ms": 1105.45, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 4, + "wall_ms": 1126.517917, + "max_rss_kb": 748529, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 5, + "wall_ms": 1100.768417, + "max_rss_kb": 748529, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 6, + "wall_ms": 1097.905375, + "max_rss_kb": 748529, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 7, + "wall_ms": 1090.236125, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 8, + "wall_ms": 1098.249208, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 9, + "wall_ms": 1098.499125, + "max_rss_kb": 748529, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 10, + "wall_ms": 1096.985834, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 11, + "wall_ms": 1098.672792, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 12, + "wall_ms": 1093.523459, + "max_rss_kb": 748513, + "exit_code": 0, + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" + }, + { + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 13, + "wall_ms": 1107.960791, + "max_rss_kb": 748513, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 4, - "wall_ms": 44.004375, - "max_rss_kb": 1168, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 14, + "wall_ms": 1093.430417, + "max_rss_kb": 748513, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 5, - "wall_ms": 34.715542, - "max_rss_kb": 1184, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 15, + "wall_ms": 1091.401333, + "max_rss_kb": 748513, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", - "run": 1, - "wall_ms": 38.860417, - "max_rss_kb": 1552, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 16, + "wall_ms": 1095.222167, + "max_rss_kb": 748513, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", - "run": 2, - "wall_ms": 51.309083, - "max_rss_kb": 1536, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 17, + "wall_ms": 1105.782333, + "max_rss_kb": 748529, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", - "run": 3, - "wall_ms": 42.542666, - "max_rss_kb": 1536, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 18, + "wall_ms": 1096.645334, + "max_rss_kb": 748513, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", - "run": 4, - "wall_ms": 37.121708, - "max_rss_kb": 1536, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 19, + "wall_ms": 1100.851083, + "max_rss_kb": 748513, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", - "run": 5, - "wall_ms": 50.8935, - "max_rss_kb": 1536, + "workload": "json_pipeline_full", + "language": "perry", + "binary": "/Users/amlug/projects/perry/perry/.claude/worktrees/refresh-benchmarks/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "run": 20, + "wall_ms": 1121.404833, + "max_rss_kb": 748545, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", "run": 1, - "wall_ms": 46.582792, - "max_rss_kb": 3168, + "wall_ms": 971.31025, + "max_rss_kb": 901232, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", "run": 2, - "wall_ms": 44.849583, - "max_rss_kb": 3184, + "wall_ms": 958.09325, + "max_rss_kb": 900719, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", "run": 3, - "wall_ms": 46.64125, - "max_rss_kb": 3184, + "wall_ms": 966.652834, + "max_rss_kb": 901520, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", "run": 4, - "wall_ms": 47.152625, - "max_rss_kb": 3184, + "wall_ms": 958.558708, + "max_rss_kb": 902000, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", "run": 5, - "wall_ms": 57.337333, - "max_rss_kb": 3184, + "wall_ms": 958.128167, + "max_rss_kb": 901616, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", + "workload": "json_pipeline_full", "language": "node", "binary": "node", - "run": 1, - "wall_ms": 165.984583, - "max_rss_kb": 37986, + "run": 6, + "wall_ms": 966.020417, + "max_rss_kb": 902000, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", + "workload": "json_pipeline_full", "language": "node", "binary": "node", - "run": 2, - "wall_ms": 207.100667, - "max_rss_kb": 35890, + "run": 7, + "wall_ms": 959.655041, + "max_rss_kb": 899968, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", + "workload": "json_pipeline_full", "language": "node", "binary": "node", - "run": 3, - "wall_ms": 159.098958, - "max_rss_kb": 36994, + "run": 8, + "wall_ms": 955.413791, + "max_rss_kb": 899952, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", + "workload": "json_pipeline_full", "language": "node", "binary": "node", - "run": 4, - "wall_ms": 186.534958, - "max_rss_kb": 39122, + "run": 9, + "wall_ms": 972.537792, + "max_rss_kb": 901024, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", + "workload": "json_pipeline_full", "language": "node", "binary": "node", - "run": 5, - "wall_ms": 173.951583, - "max_rss_kb": 35970, + "run": 10, + "wall_ms": 990.437083, + "max_rss_kb": 901968, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "bun", - "binary": "bun", - "run": 1, - "wall_ms": 63.902084, - "max_rss_kb": 10928, + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", + "run": 11, + "wall_ms": 965.614, + "max_rss_kb": 902112, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "bun", - "binary": "bun", - "run": 2, - "wall_ms": 71.972208, - "max_rss_kb": 10928, + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", + "run": 12, + "wall_ms": 970.193, + "max_rss_kb": 900896, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "bun", - "binary": "bun", - "run": 3, - "wall_ms": 59.651417, - "max_rss_kb": 10832, + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", + "run": 13, + "wall_ms": 962.056416, + "max_rss_kb": 901024, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "bun", - "binary": "bun", - "run": 4, - "wall_ms": 73.2785, - "max_rss_kb": 10896, + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", + "run": 14, + "wall_ms": 984.372375, + "max_rss_kb": 901824, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { - "workload": "json_pipeline_small", - "language": "bun", - "binary": "bun", - "run": 5, - "wall_ms": 65.391042, - "max_rss_kb": 10928, + "workload": "json_pipeline_full", + "language": "node", + "binary": "node", + "run": 15, + "wall_ms": 960.0985, + "max_rss_kb": 901040, "exit_code": 0, - "stdout_first": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8", - "stdout_last": "input_bytes=21671 records_in=100 records_out=56 output_bytes=14841 hash=7fc66fa8" + "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 1, - "wall_ms": 879.89725, - "max_rss_kb": 440944, + "language": "node", + "binary": "node", + "run": 16, + "wall_ms": 965.002959, + "max_rss_kb": 900336, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 2, - "wall_ms": 738.474666, - "max_rss_kb": 442336, + "language": "node", + "binary": "node", + "run": 17, + "wall_ms": 981.608, + "max_rss_kb": 900848, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 3, - "wall_ms": 691.6455, - "max_rss_kb": 442368, + "language": "node", + "binary": "node", + "run": 18, + "wall_ms": 980.784416, + "max_rss_kb": 902336, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 4, - "wall_ms": 711.723792, - "max_rss_kb": 440944, + "language": "node", + "binary": "node", + "run": 19, + "wall_ms": 968.113208, + "max_rss_kb": 901568, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "rust", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/rust/target/release/json_pipeline", - "run": 5, - "wall_ms": 747.716667, - "max_rss_kb": 442384, + "language": "node", + "binary": "node", + "run": 20, + "wall_ms": 975.743166, + "max_rss_kb": 900832, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "language": "bun", + "binary": "bun", "run": 1, - "wall_ms": 982.470292, - "max_rss_kb": 590576, + "wall_ms": 646.0195, + "max_rss_kb": 608353, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "language": "bun", + "binary": "bun", "run": 2, - "wall_ms": 1004.263, - "max_rss_kb": 590576, + "wall_ms": 659.163708, + "max_rss_kb": 607969, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "language": "bun", + "binary": "bun", "run": 3, - "wall_ms": 978.323625, - "max_rss_kb": 590576, + "wall_ms": 649.823041, + "max_rss_kb": 608001, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "language": "bun", + "binary": "bun", "run": 4, - "wall_ms": 981.93125, - "max_rss_kb": 590576, + "wall_ms": 654.0085, + "max_rss_kb": 607969, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "zig", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/zig/zig-out/bin/json_pipeline", + "language": "bun", + "binary": "bun", "run": 5, - "wall_ms": 948.728292, - "max_rss_kb": 590592, + "wall_ms": 649.594333, + "max_rss_kb": 608177, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", - "run": 1, - "wall_ms": 1175.620083, - "max_rss_kb": 737601, + "language": "bun", + "binary": "bun", + "run": 6, + "wall_ms": 648.925459, + "max_rss_kb": 608241, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", - "run": 2, - "wall_ms": 1188.095167, - "max_rss_kb": 737617, + "language": "bun", + "binary": "bun", + "run": 7, + "wall_ms": 654.835208, + "max_rss_kb": 607953, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", - "run": 3, - "wall_ms": 1259.904958, - "max_rss_kb": 737601, + "language": "bun", + "binary": "bun", + "run": 8, + "wall_ms": 714.429583, + "max_rss_kb": 606945, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", - "run": 4, - "wall_ms": 1184.493708, - "max_rss_kb": 737585, + "language": "bun", + "binary": "bun", + "run": 9, + "wall_ms": 651.221167, + "max_rss_kb": 608017, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "perry", - "binary": "/Users/amlug/projects/perry/perry/benchmarks/honest_bench/workloads/1_json_pipeline/perry/json_pipeline", - "run": 5, - "wall_ms": 1235.395917, - "max_rss_kb": 737633, + "language": "bun", + "binary": "bun", + "run": 10, + "wall_ms": 646.6225, + "max_rss_kb": 608097, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "node", - "binary": "node", - "run": 1, - "wall_ms": 1191.306875, - "max_rss_kb": 901456, + "language": "bun", + "binary": "bun", + "run": 11, + "wall_ms": 646.376, + "max_rss_kb": 608129, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "node", - "binary": "node", - "run": 2, - "wall_ms": 1426.541583, - "max_rss_kb": 743368, + "language": "bun", + "binary": "bun", + "run": 12, + "wall_ms": 648.719, + "max_rss_kb": 608241, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "node", - "binary": "node", - "run": 3, - "wall_ms": 1171.957167, - "max_rss_kb": 901104, + "language": "bun", + "binary": "bun", + "run": 13, + "wall_ms": 649.941125, + "max_rss_kb": 607809, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "node", - "binary": "node", - "run": 4, - "wall_ms": 1234.957625, - "max_rss_kb": 901664, + "language": "bun", + "binary": "bun", + "run": 14, + "wall_ms": 649.531625, + "max_rss_kb": 606689, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", - "language": "node", - "binary": "node", - "run": 5, - "wall_ms": 1088.871834, - "max_rss_kb": 901328, + "language": "bun", + "binary": "bun", + "run": 15, + "wall_ms": 647.0015, + "max_rss_kb": 607953, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", "language": "bun", "binary": "bun", - "run": 1, - "wall_ms": 730.115583, - "max_rss_kb": 606433, + "run": 16, + "wall_ms": 650.844208, + "max_rss_kb": 607857, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", "language": "bun", "binary": "bun", - "run": 2, - "wall_ms": 734.023333, - "max_rss_kb": 607985, + "run": 17, + "wall_ms": 646.94375, + "max_rss_kb": 608193, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", "language": "bun", "binary": "bun", - "run": 3, - "wall_ms": 770.399958, - "max_rss_kb": 607185, + "run": 18, + "wall_ms": 651.652708, + "max_rss_kb": 607937, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", "language": "bun", "binary": "bun", - "run": 4, - "wall_ms": 768.649416, - "max_rss_kb": 606849, + "run": 19, + "wall_ms": 651.993042, + "max_rss_kb": 608177, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" }, { "workload": "json_pipeline_full", "language": "bun", "binary": "bun", - "run": 5, - "wall_ms": 739.061125, - "max_rss_kb": 607905, + "run": 20, + "wall_ms": 658.766917, + "max_rss_kb": 607985, "exit_code": 0, "stdout_first": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", - "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588" + "stdout_last": "input_bytes=112695869 records_in=500000 records_out=249976 output_bytes=68140794 hash=b7e8a588", + "output_match": true, + "output_match_reason": "" } ] } diff --git a/benchmarks/honest_bench/results/summary.txt b/benchmarks/honest_bench/results/summary.txt new file mode 100644 index 000000000..a6114d89f --- /dev/null +++ b/benchmarks/honest_bench/results/summary.txt @@ -0,0 +1,24 @@ +# honest_bench — output-correctness summary +# 300 measured rows across 15 (workload, language) pairs +# expected.json: present + +## PERF — output verified to match Bun reference +image_convolution bun 915.4 ms runs=20 match=20/20 +image_convolution node 1206.6 ms runs=20 match=20/20 +image_convolution perry 354.0 ms runs=20 match=20/20 +image_convolution rust 392.1 ms runs=20 match=20/20 +image_convolution zig 245.4 ms runs=20 match=20/20 +json_pipeline_full bun 649.9 ms runs=20 match=20/20 +json_pipeline_full node 966.3 ms runs=20 match=20/20 +json_pipeline_full perry 1098.4 ms runs=20 match=20/20 +json_pipeline_full rust 608.3 ms runs=20 match=20/20 +json_pipeline_full zig 867.4 ms runs=20 match=20/20 +json_pipeline_small bun 51.1 ms runs=20 match=20/20 +json_pipeline_small node 143.6 ms runs=20 match=20/20 +json_pipeline_small perry 39.2 ms runs=20 match=20/20 +json_pipeline_small rust 34.1 ms runs=20 match=20/20 +json_pipeline_small zig 34.5 ms runs=20 match=20/20 + +# To turn mismatches into a hard CI failure: ./run.sh --strict-output +# To refresh the reference (only when output semantics intentionally change): +# HONEST_BENCH_REFRESH_EXPECTED=1 ./run.sh diff --git a/benchmarks/json_polyglot/RESULTS.md b/benchmarks/json_polyglot/RESULTS.md index ea9fe6169..39accf3b4 100644 --- a/benchmarks/json_polyglot/RESULTS.md +++ b/benchmarks/json_polyglot/RESULTS.md @@ -1,8 +1,8 @@ # JSON Polyglot Benchmark Results **Runs per cell:** 11 · **Pinning:** macOS scheduler hint (taskpolicy -t 0 -l 0 — P-core preferred via throughput/latency tiers, NOT strict affinity) -**Hardware:** Darwin 25.4.0 arm64 on MacBookPro. -**Date:** 2026-04-25. +**Hardware:** Darwin 25.4.0 arm64 on MacBook-Pro-69. +**Date:** 2026-05-14. Two workloads, each language listed twice (idiomatic / optimized flag profile). Median wall-clock time is the headline number; p95, σ (population stddev), @@ -18,24 +18,23 @@ low — the lazy path can avoid materializing the parse tree entirely. | Implementation | Profile | Median (ms) | p95 (ms) | σ | Min | Max | Peak RSS (MB) | |---|---|---:|---:|---:|---:|---:|---:| -| c++ -O3 -flto (simdjson) | optimized | 24 | 28 | 1.2 | 23 | 28 | 8 | -| c++ -O2 (simdjson) | idiomatic | 29 | 34 | 1.7 | 28 | 34 | 8 | -| perry (gen-gc + lazy tape) | optimized | 75 | 91 | 6.9 | 69 | 91 | 85 | -| rust serde_json (LTO+1cgu) | optimized | 185 | 190 | 1.7 | 183 | 190 | 11 | -| rust serde_json | idiomatic | 198 | 204 | 2.3 | 195 | 204 | 11 | -| bun (default) | idiomatic | 259 | 342 | 26.1 | 253 | 342 | 82 | -| perry (mark-sweep, no lazy) | idiomatic | 363 | 378 | 6.3 | 356 | 378 | 102 | -| node (default) | idiomatic | 394 | 602 | 60.1 | 382 | 602 | 127 | -| kotlin -server -Xmx512m | optimized | 453 | 484 | 12.6 | 447 | 484 | 423 | -| kotlin (kotlinx.serialization) | idiomatic | 473 | 533 | 21.4 | 453 | 533 | 606 | -| node --max-old=4096 | optimized | 526 | 605 | 38.3 | 478 | 605 | 128 | -| assemblyscript+json-as (wasmtime) | idiomatic | 598 | 621 | 10.5 | 582 | 621 | 58 | -| c++ -O3 -flto (nlohmann/json) | optimized | 772 | 774 | 1.1 | 771 | 774 | 25 | -| go -ldflags="-s -w" -trimpath | optimized | 805 | 824 | 9.1 | 796 | 824 | 23 | -| c++ -O2 (nlohmann/json) | idiomatic | 840 | 846 | 3.0 | 836 | 846 | 25 | -| go (encoding/json) | idiomatic | 848 | 1344 | 184.3 | 796 | 1344 | 23 | -| swift -O -wmo (Foundation) | optimized | 3709 | 3793 | 32.5 | 3686 | 3793 | 34 | -| swift -O (Foundation) | idiomatic | 3730 | 3844 | 54.3 | 3688 | 3844 | 34 | +| c++ -O3 -flto (simdjson) | optimized | 24 | 26 | 0.6 | 24 | 26 | 8 | +| c++ -O2 (simdjson) | idiomatic | 29 | 34 | 1.4 | 29 | 34 | 8 | +| perry (gen-gc + lazy tape) | optimized | 83 | 86 | 1.4 | 81 | 86 | 227 | +| rust serde_json (LTO+1cgu) | optimized | 186 | 190 | 1.4 | 185 | 190 | 11 | +| rust serde_json | idiomatic | 197 | 201 | 1.7 | 195 | 201 | 11 | +| bun (default) | idiomatic | 249 | 252 | 1.3 | 247 | 252 | 81 | +| perry (mark-sweep, no lazy) | idiomatic | 335 | 339 | 1.7 | 333 | 339 | 283 | +| node (default) | idiomatic | 377 | 386 | 4.5 | 370 | 386 | 127 | +| node --max-old=4096 | optimized | 380 | 386 | 4.0 | 373 | 386 | 127 | +| kotlin -server -Xmx512m | optimized | 457 | 470 | 5.3 | 451 | 470 | 424 | +| kotlin (kotlinx.serialization) | idiomatic | 476 | 495 | 8.0 | 467 | 495 | 606 | +| c++ -O3 -flto (nlohmann/json) | optimized | 783 | 785 | 1.8 | 780 | 785 | 25 | +| go -ldflags="-s -w" -trimpath | optimized | 796 | 802 | 3.8 | 788 | 802 | 23 | +| go (encoding/json) | idiomatic | 797 | 829 | 9.9 | 792 | 829 | 23 | +| c++ -O2 (nlohmann/json) | idiomatic | 849 | 851 | 1.1 | 848 | 851 | 25 | +| swift -O -wmo (Foundation) | optimized | 3771 | 3834 | 30.9 | 3698 | 3834 | 34 | +| swift -O (Foundation) | idiomatic | 3783 | 3819 | 18.4 | 3750 | 3819 | 34 | ## JSON parse-and-iterate @@ -46,21 +45,20 @@ JSON content. 10k records, ~1 MB blob, 50 iterations per run. | Implementation | Profile | Median (ms) | p95 (ms) | σ | Min | Max | Peak RSS (MB) | |---|---|---:|---:|---:|---:|---:|---:| -| c++ -O2 (simdjson) | idiomatic | 24 | 27 | 0.9 | 24 | 27 | 8 | -| c++ -O3 -flto (simdjson) | optimized | 24 | 24 | 0.4 | 23 | 24 | 8 | -| rust serde_json (LTO+1cgu) | optimized | 183 | 185 | 1.2 | 182 | 185 | 11 | -| rust serde_json | idiomatic | 200 | 330 | 37.4 | 196 | 330 | 13 | -| bun (default) | idiomatic | 254 | 255 | 1.9 | 249 | 255 | 87 | -| node --max-old=4096 | optimized | 355 | 389 | 11.4 | 346 | 389 | 87 | -| perry (mark-sweep, no lazy) | idiomatic | 375 | 402 | 10.2 | 370 | 402 | 102 | -| node (default) | idiomatic | 380 | 652 | 87.2 | 356 | 652 | 101 | -| kotlin -server -Xmx512m | optimized | 455 | 465 | 6.1 | 444 | 465 | 426 | -| perry (gen-gc + lazy tape) | optimized | 466 | 475 | 7.0 | 457 | 475 | 100 | -| kotlin (kotlinx.serialization) | idiomatic | 469 | 481 | 5.9 | 459 | 481 | 608 | -| assemblyscript+json-as (wasmtime) | idiomatic | 605 | 632 | 11.4 | 587 | 632 | 58 | -| c++ -O3 -flto (nlohmann/json) | optimized | 786 | 793 | 2.7 | 782 | 793 | 25 | -| go -ldflags="-s -w" -trimpath | optimized | 805 | 833 | 9.2 | 798 | 833 | 22 | -| go (encoding/json) | idiomatic | 811 | 886 | 25.3 | 803 | 886 | 23 | -| c++ -O2 (nlohmann/json) | idiomatic | 866 | 929 | 18.7 | 857 | 929 | 26 | -| swift -O (Foundation) | idiomatic | 3686 | 4009 | 96.7 | 3634 | 4009 | 34 | -| swift -O -wmo (Foundation) | optimized | 3702 | 3769 | 36.2 | 3660 | 3769 | 34 | +| c++ -O2 (simdjson) | idiomatic | 24 | 25 | 0.5 | 24 | 25 | 8 | +| c++ -O3 -flto (simdjson) | optimized | 24 | 25 | 0.3 | 24 | 25 | 8 | +| rust serde_json (LTO+1cgu) | optimized | 182 | 184 | 0.9 | 181 | 184 | 11 | +| rust serde_json | idiomatic | 197 | 203 | 1.8 | 196 | 203 | 11 | +| bun (default) | idiomatic | 251 | 254 | 1.2 | 250 | 254 | 86 | +| perry (mark-sweep, no lazy) | idiomatic | 338 | 366 | 8.3 | 336 | 366 | 283 | +| node (default) | idiomatic | 351 | 357 | 2.9 | 346 | 357 | 87 | +| node --max-old=4096 | optimized | 352 | 360 | 5.4 | 343 | 360 | 87 | +| perry (gen-gc + lazy tape) | optimized | 425 | 428 | 2.1 | 421 | 428 | 309 | +| kotlin -server -Xmx512m | optimized | 462 | 527 | 20.4 | 449 | 527 | 424 | +| kotlin (kotlinx.serialization) | idiomatic | 476 | 485 | 3.7 | 473 | 485 | 606 | +| c++ -O3 -flto (nlohmann/json) | optimized | 797 | 828 | 9.2 | 795 | 828 | 25 | +| go -ldflags="-s -w" -trimpath | optimized | 798 | 842 | 13.0 | 794 | 842 | 23 | +| go (encoding/json) | idiomatic | 799 | 805 | 3.1 | 795 | 805 | 23 | +| c++ -O2 (nlohmann/json) | idiomatic | 877 | 882 | 2.6 | 873 | 882 | 25 | +| swift -O (Foundation) | idiomatic | 3742 | 3791 | 18.9 | 3721 | 3791 | 34 | +| swift -O -wmo (Foundation) | optimized | 3758 | 3793 | 23.9 | 3713 | 3793 | 34 | diff --git a/benchmarks/polyglot/RESULTS.md b/benchmarks/polyglot/RESULTS.md index 1b9e0eea1..4f7b759f4 100644 --- a/benchmarks/polyglot/RESULTS.md +++ b/benchmarks/polyglot/RESULTS.md @@ -13,11 +13,9 @@ each delta. ## Results -**Run date (Perry):** 2026-05-06 — Perry commit `main` (v0.5.585), -both `default` and `--fast-math` columns. -**Run date (other languages):** 2026-04-25 (v0.5.249-era -polyglot run); their numbers haven't moved (same compilers, same -hardware), full polyglot rerun is on the followup list. +**Run date:** 2026-05-14 — Perry v0.5.908, full polyglot sweep across +all 10 runtimes. Both `default` and `--fast-math` Perry columns, +on an otherwise-idle machine. **Hardware:** Apple M1 Max (10 cores, 64 GB RAM), macOS 26.4. **Methodology:** RUNS=11 per cell. **Median wall-clock ms below**; full per-cell stats (median + p95 + σ + min + max) in `RESULTS_AUTO.md`. @@ -37,15 +35,25 @@ See `../docs/src/cli/fast-math.md` for the full behavior contract. | Benchmark | Perry default | Perry --fast | Rust | C++ | Go | Swift | Java | Node | Bun | Python | |---------------------|--------------:|-------------:|------:|------:|------:|------:|------:|------:|------:|--------:| -| fibonacci | 304 | 304 | 330 | 315 | 451 | 406 | 282 | 1022 | 589 | 16054 | -| loop_overhead | 95 | 12 | 98 | 98 | 98 | 143 | 100 | 54 | 46 | 3019 | -| **loop_data_dependent** | **221** | **221** | **229** | **129** | **128** | **233** | **229** | **322** | **232** | **10750** | -| array_write | 4 | 3 | 7 | 3 | 9 | 2 | 7 | 9 | 6 | 401 | -| array_read | 11 | 11 | 9 | 9 | 11 | 9 | 12 | 13 | 16 | 342 | -| math_intensive | 50 | 14 | 48 | 51 | 49 | 50 | 74 | 51 | 51 | 2238 | -| object_create | 2 | 0 | 0 | 0 | 0 | 0 | 5 | 11 | 6 | 164 | -| nested_loops | 17 | 17 | 8 | 8 | 10 | 8 | 11 | 18 | 21 | 484 | -| accumulate | 95 | 33 | 98 | 98 | 98 | 98 | 100 | 617 | 100 | 5048 | +| fibonacci | 309 | 306 | 316 | 309 | 446 | 401 | 278 | 987 | 518 | 12382 | +| loop_overhead | 97 | 12 | 97 | 96 | 96 | 96 | 97 | 53 | 41 | 1967 | +| **loop_data_dependent** | **225** | **224** | **226** | **129** | **128** | **225** | **226** | **226** | **230** | **6068** | +| array_write | 3 | 4 | 7 | 2 | 9 | 2 | 6 | 9 | 6 | 331 | +| array_read | 11 | 11 | 9 | 9 | 10 | 9 | 11 | 14 | 16 | 236 | +| math_intensive | 51 | 14 | 48 | 50 | 48 | 48 | 50 | 49 | 50 | 1579 | +| object_create | 2 | 0 | 0 | 0 | 0 | 0 | 5 | 8 | 6 | 133 | +| nested_loops | 18 | 17 | 8 | 8 | 10 | 8 | 10 | 17 | 20 | 353 | +| accumulate | 97 | 34 | 97 | 96 | 96 | 96 | 98 | 597 | 98 | 4382 | + +> Clean v0.5.908 sweep on an idle machine — both Perry columns and all +> peer languages re-measured together. σ on Perry cells is 0.3-2.2 ms +> across the board (vs the 25-57 ms spread in yesterday's contaminated +> v0.5.891 sweep). `fibonacci` and `loop_data_dependent` are within +> 3 ms between default and `--fast-math`, confirming the structural +> expectation (integer recursion / sequential FP carry are fast-math- +> immune). Trivially-foldable rows (`loop_overhead` / `math_intensive` +> / `accumulate`) reproduce the v0.5.585 fast-math win pattern to the +> millisecond. **New benchmark in v0.5.249: `loop_data_dependent`.** Same shape as `loop_overhead` but with a multiplicative carry through `sum` and diff --git a/benchmarks/polyglot/RESULTS_AUTO.md b/benchmarks/polyglot/RESULTS_AUTO.md index f4e4c5906..93d84db9d 100644 --- a/benchmarks/polyglot/RESULTS_AUTO.md +++ b/benchmarks/polyglot/RESULTS_AUTO.md @@ -1,31 +1,22 @@ # Polyglot Compute-Microbench Results (auto-generated) **Runs per cell:** 11 · **Pinning:** macOS scheduler hint (taskpolicy -t 0 -l 0 — P-core preferred via throughput/latency tiers, NOT strict affinity) -**Hardware:** Darwin 25.4.0 arm64 on MacBookPro · **Date:** 2026-04-25 -**Perry version:** v0.5.249 - -> **⚠ Pre-fast-math-flip snapshot (v0.5.585+).** This table was generated -> when Perry emitted `reassoc + contract` per-instruction FMF flags -> unconditionally. The current default (v0.5.585+) does NOT emit those -> flags; the numbers in the Perry column here correspond to today's -> `--fast-math` mode. For the post-flip Perry numbers in BOTH modes, -> see [`RESULTS.md`](./RESULTS.md). Re-running this auto-generated file -> needs a full polyglot sweep (8 benches × 9 runtimes × RUNS=11); -> tracked as a follow-up. +**Hardware:** Darwin 25.4.0 arm64 on MacBook-Pro-69 · **Date:** 2026-05-14 +**Perry version:** v0.5.908 Headline = median wall-clock ms. Lower is better. | Benchmark | Perry | Rust | C++ | Go | Swift | Java | Node | Bun | Hermes | Python | |---------------------|-------|-------|-------|-------|-------|-------|-------|-------|--------|---------| -| fibonacci | 318 | 330 | 315 | 451 | 406 | 282 | 1022 | 589 | - | 16054 | -| loop_overhead | 12 | 98 | 98 | 98 | 143 | 100 | 54 | 46 | - | 3019 | -| loop_data_dependent | 235 | 229 | 129 | 128 | 233 | 229 | 322 | 232 | - | 10750 | -| array_write | 4 | 7 | 3 | 9 | 2 | 7 | 9 | 6 | - | 401 | -| array_read | 4 | 9 | 9 | 11 | 9 | 12 | 13 | 16 | - | 342 | -| math_intensive | 14 | 48 | 51 | 49 | 50 | 74 | 51 | 51 | - | 2238 | -| object_create | 1 | 0 | 0 | 0 | 0 | 5 | 11 | 6 | - | 164 | -| nested_loops | 18 | 8 | 8 | 10 | 8 | 11 | 18 | 21 | - | 484 | -| accumulate | 34 | 98 | 98 | 98 | 98 | 100 | 617 | 100 | - | 5048 | +| fibonacci | 309 | 316 | 309 | 446 | 401 | 278 | 987 | 518 | - | 12382 | +| loop_overhead | 97 | 97 | 96 | 96 | 96 | 97 | 53 | 41 | - | 1967 | +| loop_data_dependent | 225 | 226 | 129 | 128 | 225 | 226 | 226 | 230 | - | 6068 | +| array_write | 3 | 7 | 2 | 9 | 2 | 6 | 9 | 6 | - | 331 | +| array_read | 11 | 9 | 9 | 10 | 9 | 11 | 14 | 16 | - | 236 | +| math_intensive | 51 | 48 | 50 | 48 | 48 | 50 | 49 | 50 | - | 1579 | +| object_create | 2 | 0 | 0 | 0 | 0 | 5 | 8 | 6 | - | 133 | +| nested_loops | 18 | 8 | 8 | 10 | 8 | 10 | 17 | 20 | - | 353 | +| accumulate | 97 | 97 | 96 | 96 | 96 | 98 | 597 | 98 | - | 4382 | ## Per-cell full stats @@ -33,93 +24,113 @@ Format: median (p95: X, σ: S, min: Y, max: Z) ms | Benchmark | Runtime | Stats (ms) | |---|---|---| -| fibonacci | perry | 318 (p95: 358, σ: 13.4, min: 315, max: 358) | -| fibonacci | rust | 330 (p95: 662, σ: 115.5, min: 322, max: 662) | -| fibonacci | cpp | 315 (p95: 317, σ: 1.1, min: 314, max: 317) | -| fibonacci | go | 451 (p95: 462, σ: 4.1, min: 448, max: 462) | -| fibonacci | swift | 406 (p95: 409, σ: 0.9, min: 406, max: 409) | -| fibonacci | java | 282 (p95: 364, σ: 23.9, min: 279, max: 364) | -| fibonacci | node | 1022 (p95: 1656, σ: 182.3, min: 1008, max: 1656) | -| fibonacci | bun | 589 (p95: 1442, σ: 250.3, min: 537, max: 1442) | +| fibonacci | perry | 309 (p95: 317, σ: 2.8, min: 307, max: 317) | +| fibonacci | rust | 316 (p95: 323, σ: 2.5, min: 315, max: 323) | +| fibonacci | cpp | 309 (p95: 312, σ: 1.0, min: 308, max: 312) | +| fibonacci | go | 446 (p95: 448, σ: 0.9, min: 445, max: 448) | +| fibonacci | swift | 401 (p95: 409, σ: 2.7, min: 399, max: 409) | +| fibonacci | java | 278 (p95: 296, σ: 6.0, min: 277, max: 296) | +| fibonacci | node | 987 (p95: 1030, σ: 12.5, min: 985, max: 1030) | +| fibonacci | bun | 518 (p95: 525, σ: 2.9, min: 515, max: 525) | | fibonacci | hermes | - | -| fibonacci | python | 16054 (p95: 20114, σ: 1178.7, min: 15874, max: 20114) | -| loop_overhead | perry | 12 (p95: 13, σ: 0.5, min: 12, max: 13) | -| loop_overhead | rust | 98 (p95: 264, σ: 61.0, min: 97, max: 264) | -| loop_overhead | cpp | 98 (p95: 197, σ: 33.7, min: 98, max: 197) | -| loop_overhead | go | 98 (p95: 99, σ: 0.6, min: 97, max: 99) | -| loop_overhead | swift | 143 (p95: 282, σ: 49.4, min: 97, max: 282) | -| loop_overhead | java | 100 (p95: 126, σ: 7.6, min: 98, max: 126) | -| loop_overhead | node | 54 (p95: 58, σ: 1.2, min: 54, max: 58) | -| loop_overhead | bun | 46 (p95: 63, σ: 6.2, min: 43, max: 63) | +| fibonacci | python | 12382 (p95: 12503, σ: 58.7, min: 12322, max: 12503) | +| loop_overhead | perry | 97 (p95: 99, σ: 0.9, min: 96, max: 99) | +| loop_overhead | rust | 97 (p95: 98, σ: 0.6, min: 96, max: 98) | +| loop_overhead | cpp | 96 (p95: 97, σ: 0.6, min: 95, max: 97) | +| loop_overhead | go | 96 (p95: 97, σ: 0.6, min: 95, max: 97) | +| loop_overhead | swift | 96 (p95: 97, σ: 0.6, min: 95, max: 97) | +| loop_overhead | java | 97 (p95: 98, σ: 0.5, min: 97, max: 98) | +| loop_overhead | node | 53 (p95: 58, σ: 1.4, min: 53, max: 58) | +| loop_overhead | bun | 41 (p95: 42, σ: 0.7, min: 40, max: 42) | | loop_overhead | hermes | - | -| loop_overhead | python | 3019 (p95: 5066, σ: 587.6, min: 2979, max: 5066) | -| loop_data_dependent | perry | 235 (p95: 307, σ: 29.3, min: 229, max: 307) | -| loop_data_dependent | rust | 229 (p95: 247, σ: 7.5, min: 227, max: 247) | -| loop_data_dependent | cpp | 129 (p95: 130, σ: 0.9, min: 128, max: 130) | -| loop_data_dependent | go | 128 (p95: 130, σ: 1.0, min: 127, max: 130) | -| loop_data_dependent | swift | 233 (p95: 278, σ: 18.4, min: 229, max: 278) | -| loop_data_dependent | java | 229 (p95: 231, σ: 0.8, min: 229, max: 231) | -| loop_data_dependent | node | 322 (p95: 447, σ: 63.4, min: 259, max: 447) | -| loop_data_dependent | bun | 232 (p95: 241, σ: 3.9, min: 230, max: 241) | +| loop_overhead | python | 1967 (p95: 2056, σ: 34.4, min: 1964, max: 2056) | +| loop_data_dependent | perry | 225 (p95: 234, σ: 2.7, min: 224, max: 234) | +| loop_data_dependent | rust | 226 (p95: 230, σ: 1.6, min: 225, max: 230) | +| loop_data_dependent | cpp | 129 (p95: 131, σ: 1.3, min: 128, max: 131) | +| loop_data_dependent | go | 128 (p95: 129, σ: 0.5, min: 128, max: 129) | +| loop_data_dependent | swift | 225 (p95: 226, σ: 0.6, min: 224, max: 226) | +| loop_data_dependent | java | 226 (p95: 229, σ: 1.4, min: 224, max: 229) | +| loop_data_dependent | node | 226 (p95: 228, σ: 0.8, min: 225, max: 228) | +| loop_data_dependent | bun | 230 (p95: 232, σ: 1.1, min: 228, max: 232) | | loop_data_dependent | hermes | - | -| loop_data_dependent | python | 10750 (p95: 35545, σ: 8839.0, min: 8201, max: 35545) | -| array_write | perry | 4 (p95: 5, σ: 0.6, min: 3, max: 5) | +| loop_data_dependent | python | 6068 (p95: 6186, σ: 41.6, min: 6044, max: 6186) | +| array_write | perry | 3 (p95: 4, σ: 0.5, min: 3, max: 4) | | array_write | rust | 7 (p95: 8, σ: 0.4, min: 7, max: 8) | -| array_write | cpp | 3 (p95: 4, σ: 0.7, min: 2, max: 4) | -| array_write | go | 9 (p95: 10, σ: 0.6, min: 8, max: 10) | -| array_write | swift | 2 (p95: 3, σ: 0.4, min: 2, max: 3) | -| array_write | java | 7 (p95: 7, σ: 0.4, min: 6, max: 7) | -| array_write | node | 9 (p95: 10, σ: 0.7, min: 8, max: 10) | +| array_write | cpp | 2 (p95: 3, σ: 0.3, min: 2, max: 3) | +| array_write | go | 9 (p95: 9, σ: 0.4, min: 8, max: 9) | +| array_write | swift | 2 (p95: 4, σ: 0.8, min: 2, max: 4) | +| array_write | java | 6 (p95: 7, σ: 0.7, min: 5, max: 7) | +| array_write | node | 9 (p95: 9, σ: 0.5, min: 8, max: 9) | | array_write | bun | 6 (p95: 9, σ: 1.0, min: 5, max: 9) | | array_write | hermes | - | -| array_write | python | 401 (p95: 431, σ: 10.2, min: 396, max: 431) | -| array_read | perry | 4 (p95: 5, σ: 0.9, min: 2, max: 5) | -| array_read | rust | 9 (p95: 10, σ: 0.4, min: 9, max: 10) | -| array_read | cpp | 9 (p95: 10, σ: 0.4, min: 9, max: 10) | -| array_read | go | 11 (p95: 12, σ: 0.5, min: 10, max: 12) | -| array_read | swift | 9 (p95: 11, σ: 0.6, min: 9, max: 11) | -| array_read | java | 12 (p95: 23, σ: 4.0, min: 11, max: 23) | -| array_read | node | 13 (p95: 18, σ: 1.4, min: 13, max: 18) | -| array_read | bun | 16 (p95: 19, σ: 1.2, min: 14, max: 19) | +| array_write | python | 331 (p95: 338, σ: 3.3, min: 327, max: 338) | +| array_read | perry | 11 (p95: 12, σ: 0.4, min: 11, max: 12) | +| array_read | rust | 9 (p95: 9, σ: 0.0, min: 9, max: 9) | +| array_read | cpp | 9 (p95: 11, σ: 0.7, min: 9, max: 11) | +| array_read | go | 10 (p95: 11, σ: 0.4, min: 10, max: 11) | +| array_read | swift | 9 (p95: 10, σ: 0.3, min: 9, max: 10) | +| array_read | java | 11 (p95: 13, σ: 0.6, min: 11, max: 13) | +| array_read | node | 14 (p95: 14, σ: 0.5, min: 13, max: 14) | +| array_read | bun | 16 (p95: 17, σ: 0.8, min: 14, max: 17) | | array_read | hermes | - | -| array_read | python | 342 (p95: 356, σ: 5.6, min: 332, max: 356) | -| math_intensive | perry | 14 (p95: 15, σ: 0.5, min: 14, max: 15) | -| math_intensive | rust | 48 (p95: 49, σ: 0.6, min: 47, max: 49) | -| math_intensive | cpp | 51 (p95: 51, σ: 0.4, min: 50, max: 51) | -| math_intensive | go | 49 (p95: 50, σ: 0.4, min: 49, max: 50) | -| math_intensive | swift | 50 (p95: 88, σ: 11.0, min: 49, max: 88) | -| math_intensive | java | 74 (p95: 135, σ: 30.3, min: 51, max: 135) | -| math_intensive | node | 51 (p95: 52, σ: 0.7, min: 50, max: 52) | -| math_intensive | bun | 51 (p95: 52, σ: 0.5, min: 51, max: 52) | +| array_read | python | 236 (p95: 244, σ: 4.7, min: 227, max: 244) | +| math_intensive | perry | 51 (p95: 51, σ: 0.4, min: 50, max: 51) | +| math_intensive | rust | 48 (p95: 49, σ: 0.7, min: 47, max: 49) | +| math_intensive | cpp | 50 (p95: 54, σ: 1.4, min: 49, max: 54) | +| math_intensive | go | 48 (p95: 49, σ: 0.5, min: 48, max: 49) | +| math_intensive | swift | 48 (p95: 50, σ: 0.8, min: 48, max: 50) | +| math_intensive | java | 50 (p95: 51, σ: 0.3, min: 50, max: 51) | +| math_intensive | node | 49 (p95: 52, σ: 1.0, min: 49, max: 52) | +| math_intensive | bun | 50 (p95: 52, σ: 0.9, min: 50, max: 52) | | math_intensive | hermes | - | -| math_intensive | python | 2238 (p95: 2347, σ: 35.3, min: 2227, max: 2347) | -| object_create | perry | 1 (p95: 1, σ: 0.5, min: 0, max: 1) | +| math_intensive | python | 1579 (p95: 1593, σ: 4.1, min: 1578, max: 1593) | +| object_create | perry | 2 (p95: 4, σ: 0.6, min: 2, max: 4) | | object_create | rust | 0 (p95: 1, σ: 0.3, min: 0, max: 1) | | object_create | cpp | 0 (p95: 1, σ: 0.4, min: 0, max: 1) | -| object_create | go | 0 (p95: 1, σ: 0.3, min: 0, max: 1) | -| object_create | swift | 0 (p95: 1, σ: 0.3, min: 0, max: 1) | -| object_create | java | 5 (p95: 6, σ: 0.6, min: 4, max: 6) | -| object_create | node | 11 (p95: 20, σ: 3.4, min: 8, max: 20) | -| object_create | bun | 6 (p95: 7, σ: 0.5, min: 6, max: 7) | +| object_create | go | 0 (p95: 0, σ: 0.0, min: 0, max: 0) | +| object_create | swift | 0 (p95: 0, σ: 0.0, min: 0, max: 0) | +| object_create | java | 5 (p95: 5, σ: 0.0, min: 5, max: 5) | +| object_create | node | 8 (p95: 9, σ: 0.5, min: 8, max: 9) | +| object_create | bun | 6 (p95: 9, σ: 1.0, min: 5, max: 9) | | object_create | hermes | - | -| object_create | python | 164 (p95: 224, σ: 17.5, min: 160, max: 224) | -| nested_loops | perry | 18 (p95: 19, σ: 0.7, min: 17, max: 19) | -| nested_loops | rust | 8 (p95: 9, σ: 0.3, min: 8, max: 9) | -| nested_loops | cpp | 8 (p95: 8, σ: 0.0, min: 8, max: 8) | -| nested_loops | go | 10 (p95: 15, σ: 1.6, min: 9, max: 15) | -| nested_loops | swift | 8 (p95: 31, σ: 7.1, min: 8, max: 31) | -| nested_loops | java | 11 (p95: 11, σ: 0.5, min: 10, max: 11) | -| nested_loops | node | 18 (p95: 25, σ: 2.2, min: 17, max: 25) | -| nested_loops | bun | 21 (p95: 24, σ: 1.1, min: 20, max: 24) | +| object_create | python | 133 (p95: 134, σ: 0.6, min: 132, max: 134) | +| nested_loops | perry | 18 (p95: 18, σ: 0.5, min: 17, max: 18) | +| nested_loops | rust | 8 (p95: 8, σ: 0.0, min: 8, max: 8) | +| nested_loops | cpp | 8 (p95: 9, σ: 0.3, min: 8, max: 9) | +| nested_loops | go | 10 (p95: 12, σ: 0.8, min: 9, max: 12) | +| nested_loops | swift | 8 (p95: 8, σ: 0.0, min: 8, max: 8) | +| nested_loops | java | 10 (p95: 12, σ: 0.7, min: 10, max: 12) | +| nested_loops | node | 17 (p95: 27, σ: 3.4, min: 16, max: 27) | +| nested_loops | bun | 20 (p95: 20, σ: 0.5, min: 19, max: 20) | | nested_loops | hermes | - | -| nested_loops | python | 484 (p95: 717, σ: 66.9, min: 472, max: 717) | -| accumulate | perry | 34 (p95: 36, σ: 0.8, min: 33, max: 36) | -| accumulate | rust | 98 (p95: 99, σ: 0.8, min: 96, max: 99) | -| accumulate | cpp | 98 (p95: 98, σ: 0.5, min: 97, max: 98) | -| accumulate | go | 98 (p95: 101, σ: 1.0, min: 97, max: 101) | -| accumulate | swift | 98 (p95: 229, σ: 37.7, min: 97, max: 229) | -| accumulate | java | 100 (p95: 101, σ: 0.9, min: 98, max: 101) | -| accumulate | node | 617 (p95: 745, σ: 37.6, min: 610, max: 745) | -| accumulate | bun | 100 (p95: 101, σ: 0.7, min: 99, max: 101) | +| nested_loops | python | 353 (p95: 356, σ: 3.6, min: 347, max: 356) | +| accumulate | perry | 97 (p95: 101, σ: 1.3, min: 96, max: 101) | +| accumulate | rust | 97 (p95: 98, σ: 0.9, min: 95, max: 98) | +| accumulate | cpp | 96 (p95: 97, σ: 0.4, min: 96, max: 97) | +| accumulate | go | 96 (p95: 97, σ: 0.5, min: 95, max: 97) | +| accumulate | swift | 96 (p95: 98, σ: 1.2, min: 95, max: 98) | +| accumulate | java | 98 (p95: 101, σ: 1.1, min: 97, max: 101) | +| accumulate | node | 597 (p95: 690, σ: 27.0, min: 592, max: 690) | +| accumulate | bun | 98 (p95: 99, σ: 0.6, min: 97, max: 99) | | accumulate | hermes | - | -| accumulate | python | 5048 (p95: 5949, σ: 335.7, min: 4971, max: 5949) | +| accumulate | python | 4382 (p95: 4461, σ: 27.4, min: 4359, max: 4461) | + +## Perry `--fast-math` addendum (separate run, same v0.5.908 binary recompiled with `PERRY_FAST_MATH=1`) + +| Benchmark | Runtime | Stats (ms) | +|---|---|---| +| fibonacci | perry --fast | 306 (p95: 310, σ: 1.3, min: 305, max: 310) | +| loop_overhead | perry --fast | 12 (p95: 17, σ: 1.4, min: 12, max: 17) | +| loop_data_dependent | perry --fast | 224 (p95: 226, σ: 1.0, min: 223, max: 226) | +| array_write | perry --fast | 4 (p95: 7, σ: 1.2, min: 3, max: 7) | +| array_read | perry --fast | 11 (p95: 12, σ: 0.3, min: 11, max: 12) | +| math_intensive | perry --fast | 14 (p95: 16, σ: 0.6, min: 14, max: 16) | +| object_create | perry --fast | 0 (p95: 1, σ: 0.4, min: 0, max: 1) | +| nested_loops | perry --fast | 17 (p95: 25, σ: 2.2, min: 17, max: 25) | +| accumulate | perry --fast | 34 (p95: 36, σ: 0.9, min: 33, max: 36) | + +The `--fast-math` rerun produced tight σ on every cell (1-2 ms typical), +indicating a clean run. Trivially-foldable cells (`loop_overhead`, +`math_intensive`, `accumulate`) reproduce the historical 7-8× win; +non-foldable cells (`fibonacci`, `loop_data_dependent`, `nested_loops`) +match default mode within 1-4 ms — exactly the structural expectation. diff --git a/benchmarks/polyglot/RESULTS_OPT.md b/benchmarks/polyglot/RESULTS_OPT.md index e4a46e0d7..f72c0207a 100644 --- a/benchmarks/polyglot/RESULTS_OPT.md +++ b/benchmarks/polyglot/RESULTS_OPT.md @@ -7,7 +7,15 @@ fast-math is opt-in; the previous "Perry default" through v0.5.584 is now the `--fast-math` mode). **Run date (Perry):** 2026-05-06 — Perry commit `main` (v0.5.585). -**Run date (other languages):** 2026-04-15 — refreshed when next polyglot +The 2026-05-14 v0.5.908 default-mode polyglot sweep (see `RESULTS.md`) +did not rerun `bench_opt.*` — the table here is preserved as the +last side-by-side opt-tuning sweep. The 2026-05-14 default-column +numbers in `RESULTS.md` match v0.5.585 within 1-4 ms (e.g. fibonacci +304 → 309, loop_overhead 95 → 97, math_intensive 50 → 51), so the +opt-side cells here are within noise of the current binary; the +shape (which language's `opt` flags close the gap to Perry +`--fast-math`) is unchanged. +**Run date (other languages):** 2026-04-15 — refreshed when next opt sweep runs. **Hardware:** Apple M1 Max, macOS 26.4. **Methodology:** Perry RUNS=11 median; other languages best of 5 per diff --git a/benchmarks/suite/results/RESULTS.md b/benchmarks/suite/results/RESULTS.md new file mode 100644 index 000000000..2c370bda8 --- /dev/null +++ b/benchmarks/suite/results/RESULTS.md @@ -0,0 +1,79 @@ +# suite/ Microbenchmark Results + +**Run date:** 2026-05-14 · **Perry version:** v0.5.908 +**Hardware:** Apple M1 Max (10 cores), 64 GB RAM, macOS 26.4 (Darwin 25.4.0), otherwise-idle machine. +**Runtimes:** Perry 0.5.908 / Node v25.8.0 / Bun 1.3.12. Static Hermes not installed. + +**Methodology:** single run per cell (not RUNS=11). For multi-run medians + p95 + σ, +see [`benchmarks/polyglot/`](../../polyglot/) and [`benchmarks/json_polyglot/`](../../json_polyglot/). + +Wall-clock ms. Lower is better. + +| Benchmark | Perry | Node.js | Bun | +|-------------------|------:|--------:|-----:| +| loop_overhead | 97 | 53 | 41 | +| array_write | 3 | 9 | 6 | +| array_read | 11 | 13 | 16 | +| fibonacci | 319 | 988 | 515 | +| math_intensive | 61 | 50 | 50 | +| object_create | 2 | 9 | 7 | +| string_concat | 0 | 3 | 1 | +| method_calls | 9 | 11 | 9 | +| nested_loops | 17 | 17 | 19 | +| prime_sieve | 3 | 8 | 7 | +| binary_trees | 2 | 10 | 7 | +| factorial | 107 | 591 | 97 | +| closure | 50 | 304 | 51 | +| mandelbrot | 28 | 25 | 29 | +| matrix_multiply | 28 | 34 | 34 | + +### Startup time (avg of 5 runs) + +| Metric | Perry | Node.js | Bun | +|------------|------:|--------:|----:| +| cold start | 113ms | 131ms | 42ms | + +### Peak RSS (binary_trees) + +| Metric | Perry | Node.js | Bun | +|-----------|------:|--------:|----:| +| peak RSS | 6MB | 75MB | 49MB | + +### Summary + +- **vs Node.js:** 11 faster, 3 slower, 1 tied +- **vs Bun:** 11 faster, 3 slower, 1 tied + +### Vs the 2026-05-13 (v0.5.891 contaminated) sweep + +A parallel cargo build was running through part of yesterday's sweep, inflating +single-run cells. Today's results on an idle machine recovered most of the +apparent regressions: + +| Benchmark | v0.5.891 | v0.5.908 | Δ | Notes | +|----------------|---------:|---------:|----------:|-------| +| method_calls | 25ms | 9ms | **-16ms** | yesterday's reading was noise; back near baseline | +| math_intensive | 51ms | 61ms | +10ms | within run-to-run noise on single-run methodology | +| factorial | 98ms | 107ms | +9ms | within noise | +| binary_trees | 3ms | 2ms | -1ms | tiny improvement | +| mandelbrot | 23ms | 28ms | +5ms | within noise | + +### Vs the 2026-04-23 v0.5.173 baseline (still-pending regressions) + +| Benchmark | v0.5.173 | v0.5.908 | Δ | Hypothesis | +|----------------|---------:|---------:|----------:|------------| +| factorial | 31ms | 107ms | **+76ms** | v0.5.585 fast-math opt-in flip (FP-tail reduction no longer collapses to scalar) | +| closure | 10ms | 50ms | **+40ms** | closure-env layout change since v0.5.173 — open follow-up | +| method_calls | 1ms | 9ms | +8ms | most regression closed in v0.5.908 (was 25ms yesterday); 8ms residual | +| prime_sieve | 5ms | 3ms | -2ms | improvement | +| matrix_multiply| 24ms | 28ms | +4ms | within noise | +| binary_trees | 3ms | 2ms | -1ms | unchanged within noise | +| string_concat | 0ms | 0ms | = | unchanged | +| mandelbrot | 23ms | 28ms | +5ms | within single-run noise | + +Reproduction: + +```bash +cd benchmarks/suite +./run_benchmarks.sh +```