50a61d7f

Created Started Finished

By: syd <syd@kronor.io>

Amortise evaluation, and stop claiming a precise atomization penalty

The per-unit breakdown is now measured: of 1177 ms for one leaf test
derivation, 816 ms is Nix evaluation, 292 ms is Vitest, and 69 ms is stdenv
plus assembling the tree. Two consequences.

Evaluation is a fixed cost per invocation, not per unit, and the scaling
section shows it barely moves with workspace size. Amortised across a 19-unit
invocation, Nix costs 156 ms per unit of work against Nx 341 ms: about twice as
fast, not slower. It looks slower only when building a single unit, where one
invocation fixed cost lands on one unit.

That also finishes off the shared-skeleton plan this document once called the
first thing to do. It could only ever have recovered the 69 ms line: 6% of one
unit, 2% of a nineteen-unit run, in exchange for a shared derivation holding the
sources that would become an input to every test.

The atomization penalty for Nix is withdrawn as a number. Two runs of the same
measurement gave +18% and +2%, so "small" is all the data supports. The case
against per-test-file granularity does not need it: the invalidation gain is
proportionally worse, 22/27 against 14/19, and the enumeration hazard is real.