Jon versus Dioptrin with a changing mask every frame

Apple M4 Pro, November5,2026; identical real Eiger9M sample and settings. Primary threshold230 masks an additional0.977% of otherwise valid pixels on average. Every frame includes new mask generation, normalization and the backend's required preparation.

ImplementationIntensity frames/sWith Poisson errors frames/s
Jon, rebuild signal matrix15.0—
Jon, stacked signal/Poisson matrix—3.0
Jon signal + SciPy Poisson15.013.9
Dioptrin0.7 public API control102.395.9
Native prototype: current_csr_two_pass113.7113.1
Native prototype: fused_csr150.8149.1
Native prototype: csc_four_histograms254.4206.3

The unmodified Dioptrin public-API control is 6.84× faster for intensity and 6.92× faster than the cheaper Jon+SciPy error adapter. Jon uses float32 weights; Dioptrin uses float64. This is the public mask-rebuilding path, not an intrinsic speed limit of Jon's C kernel.

Matrix preparation dominates Jon's cost because masks are baked into the prepared matrix. A changing mask repeats validation/copying, mask folding, analysis and layout construction. Stacking signal/variance rows further increases this cost; using SciPy for variance avoids much of that penalty.

All numerical checks passed. Actual Jon-versus-Dioptrin intensity relative L2 difference: 5.29e-10; SciPy Poisson sigma difference: 1.18e-15. The small intensity difference is consistent with Jon's float32 coefficient storage.

Protocol and limits

Artifacts

All results and ranges · Conclusions · Full provenance · Jon benchmark · DioptrinAPI control

Reproduce sequentially using the recorded temporary environment: run.py, then run_controls.py. The large frame and LUT buffers remain at their existing /tmp paths. Source and input hashes are recorded. No Dioptas or production Dioptrin code was changed for these measurements.