XLBench Results
Each section below embeds the full BenchmarkDotNet environment block (OS, CPU,
.NET SDK and runtime). Timings are hardware-specific; treat the allocation/GC
columns as the most portable signal across machines. Regenerate locally with
scripts/run-benchmarks.ps1.
⚠️ Generated on a shared GitHub Actions runner — timings are indicative and vary run to run; allocation/memory figures are reliable. Authoritative timings come from a local run: results.html.
📈 Interactive charts (GitHub Pages). Static charts and the full tables follow.
Each results table (one per test method) is heat-mapped independently on the Pages site (🟩 best → 🟥 worst).
⧗ Carried over from an earlier run. The rows and chart points below marked with this symbol were not measured here — the library is commercial and needs a licence key this run did not have — so they are replayed from
snapshots/. Compare them as indicative rather than like-for-like, and see the repository README for how to refresh a snapshot.
- IronXL 2026.8.1, Job-HTCPYF job, captured 2026-08-01 on different hardware — Windows 11 (10.0.22631.6199/23H2/2023Update/SunValley3), AMD Ryzen 9 5950X 16-Core Processor.
Libraries under test
| Library | Version | Source |
|---|---|---|
| ClosedXML | 0.105.1 | this run |
| EPPlus | 8.6.3 | this run |
| OpenXML SDK | 3.5.1 | this run |
| NPOI | 2.8.0 | this run |
| MiniExcel | 1.45.0 | this run |
| XLibur | 0.300.0 | this run |
| IronXL ⧗ | 2026.8.1 | snapshot (2026.8.1, Job-HTCPYF, captured 2026-08-01) |
Comparison charts
Lower is better. Charts render in the GitHub file view; the Pages site has interactive versions.
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Read · open workbook — time (ms)"
x-axis ["NPOI", "XLibur", "EPPlus", "IronXL ⧗", "ClosedXML"]
y-axis "Time (ms)"
bar [170.52, 919.84, 1146.48, 2201.53, 2224.43]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Read · open workbook — allocated (MB)"
x-axis ["XLibur", "NPOI", "EPPlus", "ClosedXML", "IronXL ⧗"]
y-axis "Allocated (MB)"
bar [80.76, 105.89, 518.21, 653.03, 3717.76]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Read · open + read all cells — time (ms)"
x-axis ["MiniExcel", "XLibur", "EPPlus", "OpenXML SDK", "NPOI", "IronXL ⧗", "ClosedXML"]
y-axis "Time (ms)"
bar [935.52, 1460.43, 1533.83, 1657.71, 3660.36, 7788.2, 8595.86]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Read · open + read all cells — allocated (MB)"
x-axis ["XLibur", "OpenXML SDK", "MiniExcel", "EPPlus", "ClosedXML", "NPOI", "IronXL ⧗"]
y-axis "Allocated (MB)"
bar [311.62, 627.82, 628.88, 924.42, 1073.97, 1077.68, 6333.03]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Write · create + save — time (ms)"
x-axis ["MiniExcel", "OpenXML SDK", "XLibur", "ClosedXML", "EPPlus", "NPOI", "IronXL ⧗"]
y-axis "Time (ms)"
bar [84.89, 222.06, 293.36, 536.71, 618.92, 862.67, 920.66]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Write · create + save — allocated (MB)"
x-axis ["XLibur", "MiniExcel", "OpenXML SDK", "ClosedXML", "NPOI", "EPPlus", "IronXL ⧗"]
y-axis "Allocated (MB)"
bar [60.51, 84.59, 134.19, 181.09, 247.26, 322.57, 797.63]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Report · data + conditional formatting + chart — time (ms)"
x-axis ["OpenXML SDK", "XLibur", "ClosedXML", "EPPlus", "NPOI", "IronXL ⧗"]
y-axis "Time (ms)"
bar [11.2, 12.28, 38.37, 41.9, 53.05, 374.58]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Report · data + conditional formatting + chart — allocated (MB)"
x-axis ["XLibur", "OpenXML SDK", "ClosedXML", "EPPlus", "NPOI", "IronXL ⧗"]
y-axis "Allocated (MB)"
bar [3.48, 4.92, 8.02, 13.96, 16.27, 237.38]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Edit · delete rows + set column + recalculate — time (ms)"
x-axis ["OpenXML SDK", "XLibur", "EPPlus", "ClosedXML", "NPOI", "IronXL ⧗"]
y-axis "Time (ms)"
bar [36.22, 37.79, 126.81, 475.66, 583.21, 1562.62]
---
config:
xyChart:
showDataLabel: true
---
xychart-beta
title "Edit · delete rows + set column + recalculate — allocated (MB)"
x-axis ["XLibur", "OpenXML SDK", "EPPlus", "ClosedXML", "NPOI", "IronXL ⧗"]
y-axis "Allocated (MB)"
bar [4.4, 9.8, 142.5, 337.94, 413.38, 753.86]
Detailed results
BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.4 LTS (Noble Numbat)
AMD EPYC 7763 3.14GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.302
[Host] : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3
ShortRun : .NET 10.0.10 (10.0.10, 10.0.1026.32716), X64 RyuJIT x86-64-v3
Job=ShortRun IterationCount=3 LaunchCount=1
WarmupCount=3
Read · open workbook
| Library | Type | Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| NPOI | NpoiReadBenchmarks | OpenWorkbook | 170.52 ms | 86.884 ms | 4.762 ms | 2000.0000 | 1666.6667 | 666.6667 | 105.89 MB |
| XLibur | XLiburReadBenchmarks | OpenWorkbook | 919.84 ms | 144.924 ms | 7.944 ms | 5000.0000 | 4000.0000 | 1000.0000 | 80.76 MB |
| EPPlus | EpPlusReadBenchmarks | OpenWorkbook | 1,146.48 ms | 111.155 ms | 6.093 ms | 23000.0000 | 11000.0000 | 6000.0000 | 518.21 MB |
| IronXL ⧗ | IronXlReadBenchmarks | OpenWorkbook | 2,201.535 ms | 37.5704 ms | 16.6815 ms | 235000.0000 | 67000.0000 | 7000.0000 | 3717.76 MB |
| ClosedXML | ClosedXmlReadBenchmarks | OpenWorkbook | 2,224.43 ms | 91.437 ms | 5.012 ms | 41000.0000 | 14000.0000 | 2000.0000 | 653.03 MB |
Read · open + read all cells
| Library | Type | Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| MiniExcel | MiniExcelReadBenchmarks | OpenAndReadAll | 935.52 ms | 82.014 ms | 4.495 ms | 38000.0000 | 3000.0000 | - | 628.88 MB |
| XLibur | XLiburReadBenchmarks | OpenAndReadAll | 1,460.43 ms | 79.046 ms | 4.333 ms | 15000.0000 | 12000.0000 | 3000.0000 | 311.62 MB |
| EPPlus | EpPlusReadBenchmarks | OpenAndReadAll | 1,533.83 ms | 85.871 ms | 4.707 ms | 49000.0000 | 14000.0000 | 7000.0000 | 924.42 MB |
| OpenXML SDK | OpenXmlReadBenchmarks | OpenAndReadAll | 1,657.71 ms | 111.987 ms | 6.138 ms | 40000.0000 | 6000.0000 | 1000.0000 | 627.82 MB |
| NPOI | NpoiReadBenchmarks | OpenAndReadAll | 3,660.36 ms | 4,751.046 ms | 260.421 ms | 67000.0000 | 62000.0000 | 6000.0000 | 1077.68 MB |
| IronXL ⧗ | IronXlReadBenchmarks | OpenAndReadAll | 7,788.195 ms | 256.7315 ms | 169.8120 ms | 393000.0000 | 202000.0000 | 10000.0000 | 6333.03 MB |
| ClosedXML | ClosedXmlReadBenchmarks | OpenAndReadAll | 8,595.86 ms | 374.582 ms | 20.532 ms | 60000.0000 | 24000.0000 | 4000.0000 | 1073.97 MB |
Write · create + save
| Library | Type | Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| MiniExcel | MiniExcelWriteBenchmarks | CreateAndSave | 84.89 ms | 11.390 ms | 0.624 ms | 5500.0000 | 1666.6667 | 1500.0000 | 84.59 MB |
| OpenXML SDK | OpenXmlWriteBenchmarks | CreateAndSave | 222.06 ms | 14.124 ms | 0.774 ms | 9000.0000 | 2333.3333 | 2333.3333 | 134.19 MB |
| XLibur | XLiburWriteBenchmarks | CreateAndSave | 293.36 ms | 29.482 ms | 1.616 ms | 3000.0000 | 2000.0000 | 2000.0000 | 60.51 MB |
| ClosedXML | ClosedXmlWriteBenchmarks | CreateAndSave | 536.71 ms | 108.925 ms | 5.971 ms | 11000.0000 | 6000.0000 | 3000.0000 | 181.09 MB |
| EPPlus | EpPlusWriteBenchmarks | CreateAndSave | 618.92 ms | 55.518 ms | 3.043 ms | 20000.0000 | 9000.0000 | 3000.0000 | 322.57 MB |
| NPOI | NpoiWriteBenchmarks | CreateAndSave | 862.67 ms | 18.896 ms | 1.036 ms | 16000.0000 | 12000.0000 | 3000.0000 | 247.26 MB |
| IronXL ⧗ | IronXlWriteBenchmarks | CreateAndSave | 920.655 ms | 65.9367 ms | 43.6131 ms | 48000.0000 | 16000.0000 | 3000.0000 | 797.63 MB |
Report · data + conditional formatting + chart
| Library | Type | Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| OpenXML SDK | OpenXmlReportBenchmarks | CreateStockReport | 11.20 ms | 0.673 ms | 0.037 ms | 375.0000 | 359.3750 | 187.5000 | 4.92 MB |
| XLibur | XLiburReportBenchmarks | CreateStockReport | 12.28 ms | 3.913 ms | 0.214 ms | 187.5000 | 187.5000 | 187.5000 | 3.48 MB |
| ClosedXML | ClosedXmlReportBenchmarks | CreateStockReport | 38.37 ms | 117.645 ms | 6.449 ms | 400.0000 | - | - | 8.02 MB |
| EPPlus | EpPlusReportBenchmarks | CreateStockReport | 41.90 ms | 70.454 ms | 3.862 ms | 1000.0000 | 1000.0000 | 1000.0000 | 13.96 MB |
| NPOI | NpoiReportBenchmarks | CreateStockReport | 53.05 ms | 200.058 ms | 10.966 ms | 833.3333 | 666.6667 | 333.3333 | 16.27 MB |
| IronXL ⧗ | IronXlReportBenchmarks | CreateStockReport | 374.579 ms | 38.1427 ms | 19.9494 ms | 14000.0000 | 3000.0000 | - | 237.38 MB |
Edit · delete rows + set column + recalculate
| Library | Type | Method | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|---|---|---|---|---|---|---|---|---|---|
| OpenXML SDK | OpenXmlEditBenchmarks | EditAndRecalculate | 36.22 ms | 14.948 ms | 0.819 ms | 400.0000 | 200.0000 | - | 9.8 MB |
| XLibur | XLiburEditBenchmarks | EditAndRecalculate | 37.79 ms | 42.314 ms | 2.319 ms | 142.8571 | - | - | 4.4 MB |
| EPPlus | EpPlusEditBenchmarks | EditAndRecalculate | 126.81 ms | 47.575 ms | 2.608 ms | 9000.0000 | 1250.0000 | 1000.0000 | 142.5 MB |
| ClosedXML | ClosedXmlEditBenchmarks | EditAndRecalculate | 475.66 ms | 28.725 ms | 1.574 ms | 21000.0000 | 1000.0000 | - | 337.94 MB |
| NPOI | NpoiEditBenchmarks | EditAndRecalculate | 583.21 ms | 74.677 ms | 4.093 ms | 25000.0000 | 1000.0000 | - | 413.38 MB |
| IronXL ⧗ | IronXlEditBenchmarks | EditAndRecalculate | 1,562.616 ms | 46.5205 ms | 27.6836 ms | 57000.0000 | 36000.0000 | 15000.0000 | 753.86 MB |