# Performance comparison report Accepted evidence captured 2026-08-12 on the Linux x86-64 host documented in `README.md`. Ratios are Rust divided by the pinned C# reference; lower is better. Bytes are allocated bytes per operation. Full cold and seven-sample warm measurements, throughput, allocation count support, retained heap, hashes, and toolchains are in `results/`. | Workload | Rust latency | C# latency | Ratio | Rust bytes | C# bytes | Result | |---|---:|---:|---:|---:|---:|---| | UUID/math | 107 ns | 105 ns | 1.02x | 36 | 40 | pass | | LLSD XML | 23.36 us | 38.74 us | 0.60x | 10,939 | 28,600 | pass | | LLSD JSON | 5.23 us | 21.72 us | 0.24x | 7,447 | 3,680 | reviewed pass | | LLSD binary | 2.69 us | 11.07 us | 0.24x | 6,749 | 7,960 | pass | | LLSD notation | 7.01 us | 18.87 us | 0.37x | 8,489 | 10,096 | pass | | LLSD protobuf | 7.34 us | 30.97 us | 0.24x | 8,324 | 26,120 | pass | | Packet codec | 209 ns | 176 ns | 1.19x | 124 | 264 | pass | | Asset decode | 288 ns | 2.98 us | 0.10x | 1,246 | 4,512 | pass | | Image decode | 42.67 us | 48.27 us | 0.88x | 65,536 | 131,612 | pass | | Mesh decode | 413.29 us | 378.54 us | 1.09x | 507,740 | 564,593 | pass | | Inventory update | 972 ns | 758 ns | 1.28x | 373 | 357 | pass | | Object update | 27 ns | 46 ns | 0.59x | 16 | 11 | pass | | Rendering | 5.22 us | 1.01 us | 5.15x | 9,480 | 3,048 | reviewed pass | | Client throughput | 6.23 us | 3.80 us | 1.64x | 11,795 | 12,054 | reviewed pass | The initial profile exposed two actionable regressions. Root inventory updates rebuilt the entire hierarchy and link index on every record; the new guarded root path updates only the affected node/link and changed the comparison from about 22.6x latency and 10.2x allocation to 1.28x and 1.05x. TGA decoding copied the input stream and dispatched every ordinary pixel through the fully generic orientation/palette path; the checked borrowed-input and common-layout path changed it from about 3.4x latency and 2.0x allocation to 0.88x and 0.50x. LLSD JSON, rendering, and client throughput are the reviewed differences. JSON trades 2.02x allocated bytes for 4.15x lower latency. Rendering cannot be compared as equal work: the pinned C# method is a placeholder one-face cube, while Rust returns the required complete checked mesh. Client throughput is 1.64x slower while allocating fewer bytes because Rust preserves checked results and bounded owned maps. The executable limits and rationales are in `release-criteria.json`; every other workload passes the default criteria or the documented sub-microsecond noise rule.