You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracking issue for closing the remaining gap to Node on the 19-row benchmark corpus. Perry
currently beats Node on 12 of 19 rows with a geomean of 0.7775x. This enumerates the
seven rows that still lose, each with its own ticket, evidence and owner-ready repro.
Measured on 8bfdac447 (2026-08-19 sweep, quiet M1 mini, verdict CLEAN, load 1.42 -> 2.08,
best-of-five interleaved, byte-exact output re-checked on every run).
Splitting all 19 rows by instruction ratio is unambiguous:
every row Perry wins has instructions/Node <= 1.07, mostly far below
(fib40 0.22, churn_read 0.27, tree_wide 0.37)
every row Perry loses has >= 1.25, except churn
Perry's codegen quality is not the problem. Where it emits comparable work it wins
comfortably. It loses precisely where it executes more work. That makes each remaining row a
question of "what work can be deleted", which is why every ticket above names a specific
frame and a percentage rather than a vague direction.
churn is the sole exception and therefore the most interesting: 0.99 instruction ratio and
still 1.16x slower. That one is locality, not work.
Every ticket carries the same build/measure/profile setup and the same constraints. Two that
have cost real time on this corpus and are worth repeating here:
Build the -static wrapper crates or you link a stale runtime and both A/B arms behave
identically — a vacuous "no change".
Purpose
Tracking issue for closing the remaining gap to Node on the 19-row benchmark corpus. Perry
currently beats Node on 12 of 19 rows with a geomean of 0.7775x. This enumerates the
seven rows that still lose, each with its own ticket, evidence and owner-ready repro.
Measured on
8bfdac447(2026-08-19 sweep, quiet M1 mini, verdictCLEAN, load 1.42 -> 2.08,best-of-five interleaved, byte-exact output re-checked on every run).
Current standing
The seven remaining rows
cyclesinit_typed_shape_layout20.1%shapestry_read_tracked_gc_header+shape_descriptor_by_id= 100%asyncpipechurnpipelinefmod7.3%, plus user-code method dispatchinterpiso_missThe structural finding
Splitting all 19 rows by instruction ratio is unambiguous:
(
fib400.22,churn_read0.27,tree_wide0.37)churnPerry's codegen quality is not the problem. Where it emits comparable work it wins
comfortably. It loses precisely where it executes more work. That makes each remaining row a
question of "what work can be deleted", which is why every ticket above names a specific
frame and a percentage rather than a vague direction.
churnis the sole exception and therefore the most interesting: 0.99 instruction ratio andstill 1.16x slower. That one is locality, not work.
Ordering suggestion
cycles,~20.8% of
interp, and visible oniso_missandpipeline. It alone should flipcycles.well localized.
fmod) is the cheapest concrete win and has a clear precedent in perf(runtime): give the relational operators the numeric fast path + and === already have #8395.architectural change; a staged design is already committed there.
churn) and perf: asyncpipe is 1.12x Node but NOT CPU-bound — needs event-loop/timer counters, not a sampler #8409 (asyncpipe) need different instruments than the others— hardware counters and event-loop counters respectively.
Method notes for anyone picking these up
Every ticket carries the same build/measure/profile setup and the same constraints. Two that
have cost real time on this corpus and are worth repeating here:
-staticwrapper crates or you link a stale runtime and both A/B arms behaveidentically — a vacuous "no change".
this exact corpus and measured +0.2%.