This content is for v4.x version. Switch to the Stable version.
Benchmark
Spreadsheet write benchmark of openxml-office v4.x against a comparison library for each language.
How to read this benchmark
Section titled “How to read this benchmark”The charts compare v4.x with the other library at the same number of cells. A ratio of 1.00× means they are equal; above 1.00× is a v4.x gain, and below 1.00× is a v4.x loss. Green marks a gain and red marks a loss. Speed and allocation are shown separately because a library can be faster while allocating more memory, or vice versa. The exact ratios are printed beside each bar.
- Generated: 2026-10-20 01:33:09Z
- Machine: Common (8 logical CPUs)
- Runtime: 10.0.12 on Ubuntu 26.04.1 LTS
- Layout: cells written in rows of up to 100 columns.
Notes:
- Alloc = total managed bytes allocated during the run (churn), Managed Δ = managed heap retained afterwards.
- WS = OS working set, Priv = private memory. CPU % is normalised across all logical processors (100% = one fully busy core-equivalent).
- µs/cell = wall time per cell, Cells/s = throughput.
Summary
Section titled “Summary”| Metric (across all sizes) | v4.x | v2.9.0 |
|---|---|---|
| Total managed allocation churn (MB) | 23.64 | 37210.09 |
| Total GC collections (Gen0+1+2) | 1 | 2510 |
| Total GC pause time (ms) | 0.78 | 2093.19 |
- v4.x is 291.5× faster on average (range 47.9×–563.9×).
- v4.x allocates 950.5× less managed memory on average (range 126.3×–1599.4×).
- v4.x triggered 1 GC collections vs 2510 for the legacy package.
Performance at a glance
Section titled “Performance at a glance”The speed ratios below compare elapsed time at each workload size. Bar lengths are scaled within each chart; the printed ratios are the exact comparison.
Raw metrics
Section titled “Raw metrics”| Library | Cells | Time (ms) | µs/cell | Cells/s | Alloc (MB) | Managed Δ (MB) | WS Δ (MB) | Peak WS (MB) | Peak Priv (MB) | Avg CPU (%) | Peak CPU (%) | GC 0/1/2 | File (KB) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| v4.x (project reference) | 10 | 8.73 | 873.12 | 1145 | 0.12 | 0.14 | 0.06 | 122.31 | 182.80 | 13.7 | 13.7 | 0/0/0 | 4.21 |
| v2.9.0 | 10 | 4923.14 | 492314.17 | 2 | 14.55 | 14.62 | 23.57 | 138.26 | 194.88 | 1.7 | 46.1 | 0/0/0 | 4.40 |
| v4.x (project reference) | 100 | 9.19 | 91.93 | 10878 | 0.12 | 0.13 | 0.00 | 132.37 | 189.00 | 12.4 | 12.3 | 0/0/0 | 4.60 |
| v2.9.0 | 100 | 4544.28 | 45442.83 | 22 | 44.01 | 14.53 | 14.87 | 143.50 | 198.01 | 2.6 | 22.5 | 2/1/0 | 4.79 |
| v4.x (project reference) | 1000 | 16.83 | 16.83 | 59426 | 0.31 | 0.33 | 0.00 | 140.23 | 194.74 | 12.7 | 47.1 | 0/0/0 | 7.25 |
| v2.9.0 | 1000 | 4702.12 | 4702.12 | 213 | 344.20 | 16.94 | 11.65 | 148.33 | 202.00 | 1.8 | 30.5 | 22/1/0 | 7.67 |
| v4.x (project reference) | 10000 | 108.89 | 10.89 | 91833 | 2.18 | 2.20 | 1.88 | 156.49 | 210.48 | 12.7 | 21.8 | 0/0/0 | 31.64 |
| v2.9.0 | 10000 | 7836.23 | 783.62 | 1276 | 3351.02 | 6.58 | 18.54 | 161.24 | 228.22 | 6.3 | 31.6 | 224/3/1 | 34.75 |
| v4.x (project reference) | 100000 | 1119.14 | 11.19 | 89355 | 20.92 | 6.04 | 19.35 | 314.28 | 366.96 | 13.3 | 26.6 | 1/0/0 | 280.27 |
| v2.9.0 | 100000 | 53607.02 | 536.07 | 1865 | 33456.32 | 64.75 | 82.73 | 258.66 | 358.36 | 11.7 | 41.6 | 2239/14/3 | 306.24 |
GC / memory stress
Section titled “GC / memory stress”Highlights managed allocation churn and garbage collector pressure. High Gen0/1/2 counts, GC pause time and allocation rate indicate heavier memory stress.
| Library | Cells | Alloc (MB) | Alloc/cell (bytes) | Alloc rate (MB/s) | Gen0 | Gen1 | Gen2 | GC pause (ms) | GC pause (%) | Heap (MB) | Fragmented (MB) | Committed (MB) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| v4.x (project reference) | 10 | 0.12 | 12078 | 13.19 | 0 | 0 | 0 | 0.00 | 0.00 | 3.30 | 0.85 | 15.54 |
| v2.9.0 | 10 | 14.55 | 1525422 | 2.95 | 0 | 0 | 0 | 0.00 | 0.00 | 3.44 | 0.98 | 7.93 |
| v4.x (project reference) | 100 | 0.12 | 1251 | 12.98 | 0 | 0 | 0 | 0.00 | 0.00 | 3.22 | 0.76 | 15.86 |
| v2.9.0 | 100 | 44.01 | 461458 | 9.68 | 2 | 1 | 0 | 2.18 | 0.05 | 3.68 | 0.23 | 22.86 |
| v4.x (project reference) | 1000 | 0.31 | 323 | 18.30 | 0 | 0 | 0 | 0.00 | 0.00 | 3.27 | 0.77 | 19.59 |
| v2.9.0 | 1000 | 344.20 | 360915 | 73.20 | 22 | 1 | 0 | 13.52 | 0.29 | 5.07 | 0.45 | 23.56 |
| v4.x (project reference) | 10000 | 2.18 | 228 | 19.98 | 0 | 0 | 0 | 0.00 | 0.00 | 3.29 | 0.70 | 16.05 |
| v2.9.0 | 10000 | 3351.02 | 351380 | 427.63 | 224 | 3 | 1 | 177.32 | 2.26 | 10.57 | 1.47 | 33.71 |
| v4.x (project reference) | 100000 | 20.92 | 219 | 18.69 | 1 | 0 | 0 | 0.78 | 0.07 | 3.38 | 0.79 | 27.60 |
| v2.9.0 | 100000 | 33456.32 | 350815 | 624.10 | 2239 | 14 | 3 | 1900.17 | 3.54 | 94.98 | 27.84 | 112.82 |
Head-to-head: v4.x vs comparison library
Section titled “Head-to-head: v4.x vs comparison library”Each cell is a multiplier comparing the two libraries at the same cell count. Higher is always better for v4.x, and 1.00× means they are equal.
For example, 500.00× under Faster means v4.x finished the work 500 times faster than v2.9.0; 120.00× under Less RAM churn means v4.x allocated 120 times less managed memory.
| Cells | Faster (time) | Higher throughput | Less RAM churn (alloc) | Less GC pause | Lower peak RAM | Lower peak private RAM | Smaller file |
|---|---|---|---|---|---|---|---|
| 10 | 563.86× | 563.86× | 126.29× | n/a | 1.13× | 1.07× | 1.04× |
| 100 | 494.35× | 494.35× | 368.76× | n/a | 1.08× | 1.05× | 1.04× |
| 1000 | 279.43× | 279.43× | 1117.94× | n/a | 1.06× | 1.04× | 1.06× |
| 10000 | 71.96× | 71.96× | 1540.09× | n/a | 1.03× | 1.08× | 1.10× |
| 100000 | 47.90× | 47.90× | 1599.44× | 2442.38× | 0.82× | 0.98× | 1.09× |
- Generated: 2026-10-20T01:35:59Z
- Machine: Common (8 logical CPUs)
- Runtime: go1.26.4 on linux/amd64
- Layout: cells written in rows of up to 100 columns.
Notes:
- Alloc = total heap bytes allocated during the run (churn), Heap Δ = heap retained afterwards.
- Peak Heap = peak in-use heap, Peak Sys = peak memory reserved from the OS. CPU % is normalised across all logical processors (100% = one fully busy core-equivalent).
- µs/cell = wall time per cell, Cells/s = throughput.
Summary
Section titled “Summary”| Metric (across all sizes) | v4.x | excelize v2 |
|---|---|---|
| Total heap allocation churn (MB) | 20.51 | 114.81 |
| Total GC collections | 7 | 15 |
| Total GC pause time (ms) | 0.42 | 0.71 |
- v4.x is 0.1× faster on average (range 0.1×–0.1×).
- v4.x allocates 54.8× less heap memory on average (range 5.4×–195.3×).
- v4.x triggered 7 GC collections vs 15 for excelize.
Performance at a glance
Section titled “Performance at a glance”The speed ratios below compare elapsed time at each workload size; allocation ratios show how much less heap v4.x used. Bar lengths are scaled within each chart; the printed ratios are the exact comparison. Green marks a v4.x gain and red marks a loss.
Raw metrics
Section titled “Raw metrics”| Library | Cells | Time (ms) | µs/cell | Cells/s | Alloc (MB) | Heap Δ (MB) | Peak Heap (MB) | Peak Sys (MB) | Avg CPU (%) | Peak CPU (%) | GC | File (KB) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| v4.x (module reference) | 10 | 7.41 | 740.92 | 1350 | 0.01 | 0.01 | 2.84 | 13.03 | 12.7 | 0.0 | 0 | 4.22 |
| excelize v2 | 10 | 0.94 | 94.21 | 10615 | 1.08 | 1.08 | 2.05 | 13.40 | 13.2 | 0.0 | 0 | 5.59 |
| v4.x (module reference) | 100 | 8.90 | 88.97 | 11240 | 0.02 | 0.02 | 2.84 | 13.66 | 12.7 | 0.0 | 0 | 4.60 |
| excelize v2 | 100 | 0.87 | 8.67 | 115390 | 1.19 | 1.19 | 2.05 | 13.66 | 13.1 | 0.0 | 0 | 5.98 |
| v4.x (module reference) | 1000 | 16.34 | 16.34 | 61182 | 0.19 | 0.19 | 3.02 | 13.66 | 12.7 | 11.1 | 0 | 7.25 |
| excelize v2 | 1000 | 2.36 | 2.36 | 423401 | 2.05 | 2.05 | 2.05 | 13.92 | 13.4 | 0.0 | 0 | 8.62 |
| v4.x (module reference) | 10000 | 103.89 | 10.39 | 96253 | 1.83 | 1.83 | 4.69 | 13.92 | 12.6 | 13.5 | 0 | 31.65 |
| excelize v2 | 10000 | 13.91 | 1.39 | 718978 | 11.02 | 1.20 | 2.05 | 13.92 | 14.9 | 0.0 | 4 | 32.62 |
| v4.x (module reference) | 100000 | 1084.88 | 10.85 | 92176 | 18.46 | -0.41 | 4.47 | 17.94 | 12.7 | 15.6 | 7 | 280.28 |
| excelize v2 | 100000 | 128.64 | 1.29 | 777366 | 99.47 | 4.61 | 48.68 | 62.33 | 15.0 | 19.2 | 11 | 279.39 |
GC / memory stress
Section titled “GC / memory stress”Highlights heap allocation churn and garbage collector pressure. High GC counts, GC pause time and allocation rate indicate heavier memory stress.
| Library | Cells | Alloc (MB) | Alloc/cell (bytes) | Alloc rate (MB/s) | GC | GC pause (ms) | GC pause (%) | Heap Sys (MB) |
|---|---|---|---|---|---|---|---|---|
| v4.x (module reference) | 10 | 0.01 | 578 | 0.74 | 0 | 0.00 | 0.00 | 7.59 |
| excelize v2 | 10 | 1.08 | 112934 | 1143.26 | 0 | 0.00 | 0.00 | 7.56 |
| v4.x (module reference) | 100 | 0.02 | 222 | 2.38 | 0 | 0.00 | 0.00 | 7.50 |
| excelize v2 | 100 | 1.19 | 12508 | 1376.39 | 0 | 0.00 | 0.00 | 7.53 |
| v4.x (module reference) | 1000 | 0.19 | 195 | 11.36 | 0 | 0.00 | 0.00 | 7.53 |
| excelize v2 | 1000 | 2.05 | 2154 | 869.95 | 0 | 0.00 | 0.00 | 7.50 |
| v4.x (module reference) | 10000 | 1.83 | 192 | 17.66 | 0 | 0.00 | 0.00 | 7.50 |
| excelize v2 | 10000 | 11.02 | 1156 | 792.50 | 4 | 0.18 | 1.30 | 11.50 |
| v4.x (module reference) | 100000 | 18.46 | 194 | 17.01 | 7 | 0.42 | 0.04 | 11.50 |
| excelize v2 | 100000 | 99.47 | 1043 | 773.21 | 11 | 0.53 | 0.41 | 55.50 |
Head-to-head: v4.x vs excelize v2
Section titled “Head-to-head: v4.x vs excelize v2”Each cell is a multiplier comparing the two libraries at the same cell count. Higher is always better for v4.x, and 1.00× means they are equal.
| Cells | Faster (time) | Higher throughput | Less RAM churn (alloc) | Less GC pause | Lower peak heap | Lower peak sys RAM | Smaller file |
|---|---|---|---|---|---|---|---|
| 10 | 0.13× | 0.13× | 195.25× | n/a | 0.72× | 1.03× | 1.33× |
| 100 | 0.10× | 0.10× | 56.26× | n/a | 0.72× | 1.00× | 1.30× |
| 1000 | 0.14× | 0.14× | 11.06× | n/a | 0.68× | 1.02× | 1.19× |
| 10000 | 0.13× | 0.13× | 6.01× | n/a | 0.44× | 1.00× | 1.03× |
| 100000 | 0.12× | 0.12× | 5.39× | 1.27× | 10.89× | 3.47× | 1.00× |
Under construction
Section titled “Under construction”Benchmarks for additional languages are coming soon.