Benchmark snapshot — 2026-06-23 · e3b7c268
Official NumSharp-vs-NumPy 3-size comparison + the five matrix subsystems, persisted for provenance. Auto-generated by benchmark/scripts/snapshot_history.py.
Provenance
| Run timestamp | 20260623-065155 |
| Git HEAD | e3b7c268 — bench: regenerate full NumSharp-vs-NumPy report (op-matrix … |
| Working tree | clean (HEAD exactly) |
| Date | 2026-06-23 |
Environment
| CPU | 13th Gen Intel Core i9-13900K |
| OS | Windows 11 (10.0.26200) |
| .NET SDK | 10.0.101 (net10.0, Release) |
| Python | 3.12.12 |
| NumPy | 2.4.2 |
Convention
Ratio = NumPy_ms ÷ NumSharp_ms (NPY/NS) → >1.0× = NumSharp faster (higher is better).
Methodology
- C#: BenchmarkDotNet,
OfficialBenchmarkConfig— InProcessEmit toolchain, 50 measured iterations / 5 warmup, iteration time capped at 25 ms. MemoryDiagnoser on. - NumPy: 50 timed iterations / 10 warmup per op (warm long-lived interpreter).
- Sizes: 1,000 / 100,000 / 10,000,000 elements. Same seeds both sides.
- Join keyed on (op, dtype, N).
- Subsystems appended to
benchmark-report.md: NDIter, Layout, Operand, Cast, Fusion.
Headline — op-matrix geomean by size (NPY/NS, >1 = NumSharp faster)
| Size | geomean | %NumPy🕐 | ✅ / 🟡 / 🟠 / 🔴 |
|---|---|---|---|
| 1,000 | 1.14x | 87% | 115 / 69 / 27 / 13 |
| 100,000 | 0.90x | 111% | 280 / 138 / 119 / 48 |
| 10,000,000 | 1.26x | 80% | 397 / 150 / 31 / 11 |
Overall op-matrix: 1851 ops | ✅ 792 | 🟡 357 | 🟠 177 | 🔴 72 | ▫ 384 | ⚪ 69.
NDIter: HEADLINE — operation matrix: 1.18× geomean · 85%🕐 of NumPy's time · 72 win / 58 lose over 130 cells
Cast: 129 / 1568 comparable cells lag (<1.0); 1439 win (≥1.0).
Files
| file | what |
|---|---|
benchmark-report.md |
op-matrix (per-(op,dtype,N) ratio) + appended NDIter/Layout/Operand/Cast/Fusion |
benchmark-report.json / .csv |
unified machine-readable / spreadsheet form |
numpy-results.json |
raw NumPy timings (merge input) |
nditer_results.* + cards/ |
iterator benchmark sheet + README cards |
layout_/operand_/cast_/fusion_results.* |
the four matrix-subsystem sheets |
Raw BenchmarkDotNet per-class JSON (~tens of MB) is not persisted here (regenerable). Reproduce with python benchmark/run_benchmark.py.