- Intro
- 2025-10-18 pm
- 2025-10-19 pm
- 2025-10-23
- 2025-10-26
- 2025-10-25
- 2025-10-26
- 2025-11-01
- 2025-11-04
- 2025-11-07
- 2025-11-08
- 2025-11-12
- 2025-11-16 - Beta V2
- 2025-11-25 - Beta V2
- 2025-11-27 - Beta V2
- 2025-11-18 - Beta V2
- 2025-12-01 - Beta V2
- 2025-12-02 - Beta V2
- 2025-12-04 - Beta V2
- 2025-12-07 - Beta V2
- 2025-12-10
- 2025-12-20
- 2025-12-21
- 2026-01-02
- 2026-01-04
- 2026-01-11
- 2026-01-16 - V3
- 2026-01-18 - V4 Alpha
- 2026-01-20 - V4 Alpha
- 2026-01-31 - V4 Alpha
- 2026-04-05 - V4 Beta
- 2026-04-10 - V4 - Beta
- 2026-04-22 - V4 - RC2
- 2026-04-27 - V4 - RC3
- 2026-05-## - V4
All done with the following
BenchmarkDotNet v0.15.4, Windows 11 (10.0.26100.6584/24H2/2024Update/HudsonValley)
Intel Core i9-9900K CPU 3.60GHz (Coffee Lake), 1 CPU, 16 logical and 8 physical cores
And then slightly different versions of the following dependent on date:
.NET SDK 10.0.100-rc.1.25451.107
[Host] : .NET 8.0.20 (8.0.20, 8.0.2025.41914), X64 RyuJIT x86-64-v3
- All Cell Access
- Some performance Analysis and changes
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |--------------|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 42000.0000 | 40000.0000 | 5000.0000 | 334.79 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.24x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 10.10x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 2.25x slower | 372000.0000 | 362000.0000 | 5000.0000 | 2940.45 MB | 8.78x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 2.23x slower | 363000.0000 | 353000.0000 | 5000.0000 | 2863.75 MB | 8.55x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 392000.0000 | 376000.0000 | 375000.0000 | 2696.74 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.01x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.55x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.90x slower | 423000.0000 | 422000.0000 | 5000.0000 | 3382.58 MB | 1.25x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.92x slower | 415000.0000 | 414000.0000 | 2000.0000 | 3312.35 MB | 1.23x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 13000.0000 | - | - | 106.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.05x slower | 100000.0000 | - | - | 799.74 MB | 7.49x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.98x slower | 201000.0000 | 200000.0000 | 3000.0000 | 1607.24 MB | 15.05x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 2.04x slower | 197000.0000 | 196000.0000 | 2000.0000 | 1572.79 MB | 14.73x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 13000.0000 | - | - | 104.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.09x slower | 93000.0000 | - | - | 742.13 MB | 7.08x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 2.08x slower | 194000.0000 | 193000.0000 | 3000.0000 | 1548.41 MB | 14.78x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 2.13x slower | 190000.0000 | 189000.0000 | 2000.0000 | 1514.05 MB | 14.45x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Removed the "ToString()" call in the Benchmark, because the others did not have it!
- More profilling to see where things can be saved
- Now With
FastExcel(Will not be using it again in these tests!)
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 42000.0000 | 40000.0000 | 5000.0000 | 334.79 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.35x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 10.10x more |
| AccessEveryCellFastExcel | Data/100mb.xlsx | 8.26x slower | 3164000.0000 | 477000.0000 | 9000.0000 | 25311.91 MB | 75.61x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 1.76x slower | 457000.0000 | 34000.0000 | 5000.0000 | 3622.62 MB | 10.82x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 1.79x slower | 448000.0000 | 34000.0000 | 5000.0000 | 3545.91 MB | 10.59x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 393000.0000 | 377000.0000 | 376000.0000 | 2696.74 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.02x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.55x less |
| AccessEveryCellFastExcel | Data/(...).xlsx [35] | 8.94x slower | 6977000.0000 | 898000.0000 | 10000.0000 | 55575.12 MB | 20.61x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.51x slower | 572000.0000 | 2000.0000 | 1000.0000 | 4566.56 MB | 1.69x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.58x slower | 564000.0000 | 2000.0000 | 1000.0000 | 4496.4 MB | 1.67x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 13000.0000 | - | - | 106.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.02x slower | 100000.0000 | - | - | 799.73 MB | 7.49x more |
| AccessEveryCellFastExcel | Data/(...).xlsx [39] | 6.69x slower | 1245000.0000 | 400000.0000 | 8000.0000 | 9874.29 MB | 92.48x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.51x slower | 268000.0000 | 1000.0000 | - | 2141.68 MB | 20.06x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.60x slower | 264000.0000 | 1000.0000 | - | 2107.34 MB | 19.74x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 13000.0000 | - | - | 104.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.10x slower | 93000.0000 | - | - | 742.13 MB | 7.08x more |
| AccessEveryCellFastExcel | Data/(...).xlsx [35] | 7.22x slower | 1137000.0000 | 292000.0000 | 8000.0000 | 9009.33 MB | 86.01x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.60x slower | 261000.0000 | 1000.0000 | - | 2082.97 MB | 19.89x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.64x slower | 257000.0000 | 1000.0000 | - | 2048.6 MB | 19.56x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
- After the fixes in the LazyStringLoader (Now appear to have more memory used??)
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 42000.0000 | 40000.0000 | 5000.0000 | 334.78 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.42x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 10.10x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 1.85x slower | 564000.0000 | 56000.0000 | 6000.0000 | 4461.44 MB | 13.33x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 1.91x slower | 555000.0000 | 56000.0000 | 6000.0000 | 4384.73 MB | 13.10x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 391000.0000 | 375000.0000 | 374000.0000 | 2696.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.03x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.55x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.46x slower | 572000.0000 | 1000.0000 | - | 4567.85 MB | 1.69x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.54x slower | 564000.0000 | 2000.0000 | 1000.0000 | 4497.72 MB | 1.67x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 13000.0000 | - | - | 106.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.03x slower | 100000.0000 | - | - | 799.73 MB | 7.49x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.43x slower | 268000.0000 | 1000.0000 | - | 2141.85 MB | 20.06x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.48x slower | 264000.0000 | 1000.0000 | - | 2107.51 MB | 19.74x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 13000.0000 | - | - | 104.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.10x slower | 93000.0000 | - | - | 742.13 MB | 7.08x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.53x slower | 261000.0000 | 1000.0000 | - | 2083.12 MB | 19.89x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.56x slower | 257000.0000 | 1000.0000 | - | 2048.75 MB | 19.56x more |
|-------------------------------- |--------------------- |-------------:|-------------:|------------:|------------:|------------:|------------:|
- Investigate the usage of a derived
XmlNameTable - Some tweaks to lifetimes
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 42000.0000 | 40000.0000 | 5000.0000 | 334.79 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.36x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 10.10x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 1.85x slower | 564000.0000 | 56000.0000 | 6000.0000 | 4461.44 MB | 13.33x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 1.93x slower | 555000.0000 | 56000.0000 | 6000.0000 | 4384.75 MB | 13.10x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 394000.0000 | 378000.0000 | 377000.0000 | 2696.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.04x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.55x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.47x slower | 572000.0000 | 1000.0000 | - | 4567.98 MB | 1.69x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.49x slower | 564000.0000 | 2000.0000 | 1000.0000 | 4497.72 MB | 1.67x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 13000.0000 | - | - | 106.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.05x slower | 100000.0000 | - | - | 799.73 MB | 7.49x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.42x slower | 268000.0000 | 1000.0000 | - | 2141.85 MB | 20.06x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.55x slower | 264000.0000 | 1000.0000 | - | 2107.63 MB | 19.74x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 13000.0000 | - | - | 104.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.09x slower | 93000.0000 | - | - | 742.13 MB | 7.08x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.47x slower | 261000.0000 | 1000.0000 | - | 2083.12 MB | 19.89x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.52x slower | 257000.0000 | 1000.0000 | - | 2048.75 MB | 19.56x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- make use of NameTable and
Object.ReferenceEquals - Allow many threads to add to the SharedStrings
- Add basic rawValue type detection
- Lowered the memory footprint
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 42000.0000 | 40000.0000 | 5000.0000 | 334.8 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.27x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 10.10x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 2.02x slower | 529000.0000 | 58000.0000 | 6000.0000 | 4188.77 MB | 12.51x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 2.05x slower | 520000.0000 | 56000.0000 | 6000.0000 | 4112.05 MB | 12.28x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 394000.0000 | 378000.0000 | 377000.0000 | 2696.74 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.03x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.55x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.72x slower | 509000.0000 | 2000.0000 | 1000.0000 | 4065.55 MB | 1.51x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.79x slower | 501000.0000 | 2000.0000 | 1000.0000 | 3995.39 MB | 1.48x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 13000.0000 | - | - | 106.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.04x slower | 100000.0000 | - | - | 799.73 MB | 7.49x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.75x slower | 237000.0000 | 1000.0000 | - | 1891.65 MB | 17.72x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.90x slower | 233000.0000 | 1000.0000 | - | 1857.28 MB | 17.39x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 13000.0000 | - | - | 104.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.08x slower | 93000.0000 | - | - | 742.13 MB | 7.08x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.73x slower | 244000.0000 | 1000.0000 | - | 1950.46 MB | 18.62x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.80x slower | 240000.0000 | 1000.0000 | - | 1915.95 MB | 18.29x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Make use of
RestrictedNameTables - Use additional offset to reduce locking intensity
- Use Atoms in the Sheet reader
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 42000.0000 | 40000.0000 | 5000.0000 | 334.79 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.38x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 10.10x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 1.91x slower | 518000.0000 | 53000.0000 | 6000.0000 | 4093.55 MB | 12.23x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 1.96x slower | 508000.0000 | 54000.0000 | 6000.0000 | 4016.82 MB | 12.00x more |
| | | | | | | | |
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 392000.0000 | 376000.0000 | 375000.0000 | 2696.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.05x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.55x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.58x slower | 509000.0000 | 2000.0000 | 1000.0000 | 4065.25 MB | 1.51x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.68x slower | 501000.0000 | 2000.0000 | 1000.0000 | 3995.09 MB | 1.48x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 13000.0000 | - | - | 106.77 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.07x slower | 100000.0000 | - | - | 799.73 MB | 7.49x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.62x slower | 237000.0000 | 1000.0000 | - | 1891.62 MB | 17.72x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.73x slower | 233000.0000 | 1000.0000 | - | 1857.23 MB | 17.39x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 13000.0000 | - | - | 104.75 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.10x slower | 93000.0000 | - | - | 742.13 MB | 7.08x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.64x slower | 244000.0000 | 1000.0000 | - | 1950.32 MB | 18.62x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.71x slower | 240000.0000 | 1000.0000 | - | 1915.94 MB | 18.29x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Make all the benchmarks perform a
ToStringto ensure data is actually retrieved - Pass
Atomizedstrings around - Pass
InstanceContextaround - Add
Noneas the default convert option - Remove File buffers to allow OS to perform caching
- Correct Sheet Id's
- Extend options for Value extraction
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.74 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.03x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 1.82x slower | 525000.0000 | 55000.0000 | 6000.0000 | 4153.29 MB | 12.26x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 1.88x slower | 516000.0000 | 53000.0000 | 6000.0000 | 4076.56 MB | 12.03x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 408000.0000 | 370000.0000 | 369000.0000 | 2875.5 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.03x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.65x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.48x slower | 556000.0000 | 2000.0000 | 1000.0000 | 4436.84 MB | 1.54x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.53x slower | 548000.0000 | 2000.0000 | 1000.0000 | 4366.69 MB | 1.52x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.10x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.33x slower | 284000.0000 | 1000.0000 | - | 2271.62 MB | 8.55x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.45x slower | 280000.0000 | 1000.0000 | - | 2237.21 MB | 8.42x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 36000.0000 | - | - | 294.17 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.08x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.49x slower | 252000.0000 | 1000.0000 | - | 2015.16 MB | 6.85x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.51x slower | 248000.0000 | 1000.0000 | - | 1980.78 MB | 6.73x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Move Rented buffer into Row
- Use
char[]for ColumnName storage - Tinker with
DefinedRangeclass - Add styles of extraction to benchmark
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | Data/100mb.xlsx | 4.19x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | Data/100mb.xlsx | 1.86x slower | 508000.0000 | 55000.0000 | 6000.0000 | 4019.48 MB | 11.87x more |
| AccessEveryCellExcel_Prime | Data/100mb.xlsx | 1.88x slower | 499000.0000 | 56000.0000 | 6000.0000 | 3942.68 MB | 11.64x more |
| SimpleCellAsyncExcel_Prime | Data/100mb.xlsx | 1.84x slower | 508000.0000 | 55000.0000 | 6000.0000 | 4019.48 MB | 11.87x more |
| NumberCellAsyncExcel_Prime | Data/100mb.xlsx | 1.79x slower | 508000.0000 | 55000.0000 | 6000.0000 | 4019.46 MB | 11.87x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 426000.0000 | 388000.0000 | 387000.0000 | 2875.49 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.04x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.65x less |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.43x slower | 526000.0000 | 2000.0000 | 1000.0000 | 4202.51 MB | 1.46x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.48x slower | 518000.0000 | 2000.0000 | 1000.0000 | 4131.86 MB | 1.44x more |
| SimpleCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.47x slower | 526000.0000 | 2000.0000 | 1000.0000 | 4202.44 MB | 1.46x more |
| NumberCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.45x slower | 503000.0000 | 2000.0000 | 1000.0000 | 4016.72 MB | 1.40x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [39] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [39] | 1.09x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.35x slower | 271000.0000 | 1000.0000 | - | 2166.13 MB | 8.15x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [39] | 1.42x slower | 267000.0000 | 1000.0000 | - | 2131.77 MB | 8.02x more |
| SimpleCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.29x slower | 271000.0000 | 1000.0000 | - | 2166.13 MB | 8.15x more |
| NumberCellAsyncExcel_Prime | Data/(...).xlsx [39] | 1.40x slower | 247000.0000 | 1000.0000 | - | 1971.27 MB | 7.42x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Data/(...).xlsx [35] | baseline | 36000.0000 | - | - | 294.17 MB | |
| AccessEveryCellXlsxHelper | Data/(...).xlsx [35] | 1.07x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.46x slower | 239000.0000 | 1000.0000 | - | 1909.71 MB | 6.49x more |
| AccessEveryCellExcel_Prime | Data/(...).xlsx [35] | 1.50x slower | 235000.0000 | 1000.0000 | - | 1875.26 MB | 6.37x more |
| SimpleCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.45x slower | 239000.0000 | 1000.0000 | - | 1909.71 MB | 6.49x more |
| NumberCellAsyncExcel_Prime | Data/(...).xlsx [35] | 1.46x slower | 239000.0000 | 1000.0000 | - | 1909.65 MB | 6.49x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Add option to use the Stream from
ZipEntry - Explain the Excel cell types
- Make the Benchmark "File Names" clearer
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.26x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.60x slower | 507000.0000 | 55000.0000 | 6000.0000 | 4012.69 MB | 11.85x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.57x slower | 498000.0000 | 55000.0000 | 6000.0000 | 3936.14 MB | 11.62x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.73x slower | 507000.0000 | 55000.0000 | 6000.0000 | 4012.67 MB | 11.85x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 419000.0000 | 381000.0000 | 380000.0000 | 2875.49 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.03x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.65x less |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.21x slower | 524000.0000 | 1000.0000 | - | 4187 MB | 1.46x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.15x slower | 516000.0000 | 1000.0000 | - | 4117.17 MB | 1.43x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.25x slower | 501000.0000 | 1000.0000 | - | 4001.28 MB | 1.39x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.11x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.13x slower | 270000.0000 | 1000.0000 | - | 2160.73 MB | 8.13x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.10x slower | 266000.0000 | 1000.0000 | - | 2126.5 MB | 8.00x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.23x slower | 246000.0000 | 1000.0000 | - | 1965.82 MB | 7.40x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.17 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.08x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.26x slower | 238000.0000 | 1000.0000 | - | 1905.92 MB | 6.48x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.23x slower | 234000.0000 | 1000.0000 | - | 1871.72 MB | 6.36x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.29x slower | 238000.0000 | 1000.0000 | - | 1905.92 MB | 6.48x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Investigation into the smallest function ;-)
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.05x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.58x slower | 507000.0000 | 55000.0000 | 6000.0000 | 4012.67 MB | 11.85x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.53x slower | 498000.0000 | 55000.0000 | 6000.0000 | 3936.15 MB | 11.62x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.57x slower | 504000.0000 | 52000.0000 | 3000.0000 | 4012.66 MB | 11.85x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 399000.0000 | 361000.0000 | 360000.0000 | 2875.46 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.05x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.65x less |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.22x slower | 524000.0000 | 1000.0000 | - | 4187 MB | 1.46x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.16x slower | 516000.0000 | 1000.0000 | - | 4117.18 MB | 1.43x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.23x slower | 501000.0000 | 1000.0000 | - | 4001.28 MB | 1.39x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.12x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.12x slower | 270000.0000 | 1000.0000 | - | 2160.73 MB | 8.13x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.10x slower | 266000.0000 | 1000.0000 | - | 2126.5 MB | 8.00x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.21x slower | 246000.0000 | 1000.0000 | - | 1965.84 MB | 7.40x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.17 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.08x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.27x slower | 238000.0000 | 1000.0000 | - | 1905.91 MB | 6.48x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.23x slower | 234000.0000 | 1000.0000 | - | 1871.72 MB | 6.36x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.25x slower | 238000.0000 | 1000.0000 | - | 1905.91 MB | 6.48x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Optimise for
CellConversion.None
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.08x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.60x slower | 521000.0000 | 53000.0000 | 6000.0000 | 4123.51 MB | 12.17x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.54x slower | 512000.0000 | 54000.0000 | 6000.0000 | 4046.9 MB | 11.95x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.58x slower | 521000.0000 | 53000.0000 | 6000.0000 | 4123.5 MB | 12.17x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 392000.0000 | 354000.0000 | 353000.0000 | 2875.49 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.02x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 1.65x less |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.20x slower | 501000.0000 | 1000.0000 | - | 4002.64 MB | 1.39x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.15x slower | 493000.0000 | 1000.0000 | - | 3932.82 MB | 1.37x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.25x slower | 514000.0000 | 1000.0000 | - | 4102.53 MB | 1.43x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.09x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.09x slower | 237000.0000 | - | - | 1894.17 MB | 7.13x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.07x slower | 233000.0000 | 1000.0000 | - | 1859.94 MB | 7.00x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.24x slower | 252000.0000 | 1000.0000 | - | 2015.43 MB | 7.59x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.17 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.09x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.16x slower | 240000.0000 | 1000.0000 | - | 1917.02 MB | 6.52x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.10x slower | 236000.0000 | 1000.0000 | - | 1882.83 MB | 6.40x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.28x slower | 245000.0000 | 1000.0000 | - | 1955.51 MB | 6.65x more |
|-------------------------------- |--------------------- |-------------:|------------:|------------:|------------:|-----------:|------------:|
- Add
IEnumerables All the way down⤵️ - i.e. remove the need for Asynchronous awaits
- ⛓️💥 Breaking Change 🔩
- The Async classes now have
Asyncappended to be distinct from the non async versions - But,
Asyncinherit from the non, so they are interchangable
- The Async classes now have
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.73 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.05x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.57x slower | 523000.0000 | 54000.0000 | 6000.0000 | 4137.73 MB | 12.22x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.50x slower | 503000.0000 | 57000.0000 | 6000.0000 | 3972.08 MB | 11.73x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.57x slower | 520000.0000 | 52000.0000 | 3000.0000 | 4139.47 MB | 12.22x more |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.93 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.01x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.26x slower | 506000.0000 | 1000.0000 | - | 4037.46 MB | 12.66x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.20x slower | 488000.0000 | 1000.0000 | - | 3897.37 MB | 12.22x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.36x slower | 521000.0000 | 1000.0000 | - | 4160.83 MB | 13.05x more |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.11x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.07x slower | 237000.0000 | 1000.0000 | - | 1893.49 MB | 7.13x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.06x slower | 228000.0000 | 1000.0000 | - | 1825 MB | 6.87x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.29x slower | 252000.0000 | 1000.0000 | - | 2014.79 MB | 7.58x more |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.07x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.19x slower | 240000.0000 | 1000.0000 | - | 1916.81 MB | 6.52x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.08x slower | 231000.0000 | 1000.0000 | - | 1848.26 MB | 6.28x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.40x slower | 257000.0000 | 1000.0000 | - | 2053.52 MB | 6.98x more |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
- Make
DefinedName's work withlocalSheetIddefinitions - Start to Add Benchmarks for range extraction
| Method | ranger | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------ |--------------------- |---------:|----------:|---------:|-------------:|------------:|-----------:|----------:|
| Access100mb | Excel(...)edXML [39] | 39.508 s | 10.2098 s | 0.5596 s | 1248000.0000 | 382000.0000 | 6000.0000 | 10.21 GB |
| Access100mb | Excel(...)PPlus [36] | 13.795 s | 2.9397 s | 0.1611 s | 593000.0000 | 163000.0000 | 18000.0000 | 7.33 GB |
| Access100mb | Excel(...)Prime [40] | 8.079 s | 0.9203 s | 0.0504 s | 244000.0000 | 127000.0000 | 7000.0000 | 1.86 GB |
- Change benchmarks to use
ToStringto be fair onClosedXML - Attempt to use
FastExcel- Failed due to Bug - Use commercial
FreeSpire
| Method | ranger | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------ |--------------------- |---------:|---------:|---------:|-------------:|------------:|-----------:|----------:|
| Access100mb | Excel(...)edXML [39] | 41.751 s | 3.9483 s | 0.2164 s | 1248000.0000 | 382000.0000 | 6000.0000 | 10.21 GB |
| Access100mb | Excel(...)PPlus [36] | 14.232 s | 2.9999 s | 0.1644 s | 593000.0000 | 163000.0000 | 18000.0000 | 7.33 GB |
| Access100mb | Excel(...)Prime [40] | 8.145 s | 0.9088 s | 0.0498 s | 244000.0000 | 127000.0000 | 7000.0000 | 1.86 GB |
| Access100mb | Excel(...)Spire [39] | 24.023 s | 9.0692 s | 0.4971 s | 1181000.0000 | 445000.0000 | 6000.0000 | 9.95 GB |
- Implement usage of commercial
Aspose.Cells - Switch to
EPPlus-LPGL(It's faster than v8.x ;-))
| Method | ranger | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------ |--------------------- |---------:|---------:|---------:|-------------:|------------:|-----------:|----------:|
| Access100mb | Excel(...)Cells [41] | 7.743 s | 0.1866 s | 0.0102 s | 175000.0000 | 98000.0000 | 7000.0000 | 1.49 GB |
| Access100mb | Excel(...)edXML [39] | 40.052 s | 2.4428 s | 0.1339 s | 1248000.0000 | 382000.0000 | 6000.0000 | 10.21 GB |
| Access100mb | Excel(...)PPlus [36] | 11.381 s | 1.1321 s | 0.0621 s | 550000.0000 | 189000.0000 | 13000.0000 | 6.08 GB |
| Access100mb | Excel(...)Prime [40] | 7.786 s | 0.3911 s | 0.0214 s | 244000.0000 | 127000.0000 | 7000.0000 | 1.86 GB |
| Access100mb | Excel(...)Spire [39] | 23.528 s | 1.8896 s | 0.1036 s | 1181000.0000 | 449000.0000 | 6000.0000 | 9.95 GB |
- Replaced the dictionary with a fixed-size Cell?[]
- Defensive bounds checks when assigning parsed cells to avoid out-of-range writes.
Rowdisposal when going out ofyieldscopes- Add
ThreadStringBuilderPoolfor memory efficiency - Add
AccessPivotTableand explain why the other libraries do not work
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.10x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.55x slower | 413000.0000 | 50000.0000 | 3000.0000 | 3286.11 MB | 9.70x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.27x slower | 318000.0000 | 54000.0000 | 6000.0000 | 2504.76 MB | 7.39x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.59x slower | 417000.0000 | 53000.0000 | 6000.0000 | 3287.89 MB | 9.71x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.02x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.22x slower | 458000.0000 | 42000.0000 | 41000.0000 | 3455.5 MB | 10.84x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.08x faster | 307000.0000 | 42000.0000 | 41000.0000 | 2250.22 MB | 7.06x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.27x slower | 473000.0000 | 42000.0000 | 41000.0000 | 3578.89 MB | 11.22x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.7 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.11x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.06x slower | 192000.0000 | 1000.0000 | - | 1534.91 MB | 5.78x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.17x faster | 123000.0000 | 1000.0000 | - | 983.37 MB | 3.70x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.19x slower | 207000.0000 | 1000.0000 | - | 1656.2 MB | 6.23x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.10x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.08x slower | 195000.0000 | 1000.0000 | - | 1558.22 MB | 5.30x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.20x faster | 126000.0000 | 1000.0000 | - | 1007.03 MB | 3.42x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.35x slower | 212000.0000 | 1000.0000 | - | 1694.93 MB | 5.76x more |
| Method | ranger | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------ |--------------------- |---------:|----------:|---------:|-------------:|------------:|-----------:|----------:|
| Access100mb | Excel(...)Cells [41] | 7.662 s | 0.1705 s | 0.0093 s | 175000.0000 | 98000.0000 | 7000.0000 | 1.49 GB |
| Access100mb | Excel(...)edXML [39] | 41.662 s | 10.9401 s | 0.5997 s | 1248000.0000 | 382000.0000 | 6000.0000 | 10.21 GB |
| Access100mb | Excel(...)PPlus [36] | 11.506 s | 2.5959 s | 0.1423 s | 550000.0000 | 188000.0000 | 13000.0000 | 6.08 GB |
| Access100mb | Excel(...)Prime [40] | 6.948 s | 0.2571 s | 0.0141 s | 204000.0000 | 58000.0000 | 6000.0000 | 1.56 GB |
| Access100mb | Excel(...)Spire [39] | 23.756 s | 1.3510 s | 0.0741 s | 1181000.0000 | 449000.0000 | 6000.0000 | 9.95 GB |
- Remove explicit GC.Collect calls
- Replace per-iteration List<> with array (Cannot return sharedPool due to
yield return)
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.08x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.54x slower | 387000.0000 | 52000.0000 | 3000.0000 | 3073.08 MB | 9.07x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.28x slower | 292000.0000 | 53000.0000 | 6000.0000 | 2291.71 MB | 6.77x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.53x slower | 387000.0000 | 52000.0000 | 3000.0000 | 3074.83 MB | 9.08x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.02x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.22x slower | 433000.0000 | 42000.0000 | 41000.0000 | 3260.61 MB | 10.22x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.06x faster | 282000.0000 | 42000.0000 | 41000.0000 | 2055.34 MB | 6.45x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.29x slower | 449000.0000 | 42000.0000 | 41000.0000 | 3384 MB | 10.61x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.11x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.04x slower | 180000.0000 | 1000.0000 | - | 1439.61 MB | 5.42x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.19x faster | 111000.0000 | 1000.0000 | - | 888 MB | 3.34x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.17x slower | 195000.0000 | 1000.0000 | - | 1560.79 MB | 5.87x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.08x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.09x slower | 183000.0000 | 1000.0000 | - | 1462.85 MB | 4.97x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.19x faster | 114000.0000 | 1000.0000 | - | 911.66 MB | 3.10x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.37x slower | 200000.0000 | 1000.0000 | - | 1599.56 MB | 5.44x more |
- Removed finalizers from several classes
- Added a lightweight Row pooling strategy
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.73 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.07x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.53x slower | 375000.0000 | 56000.0000 | 6000.0000 | 2953.76 MB | 8.72x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.26x slower | 277000.0000 | 53000.0000 | 6000.0000 | 2172.4 MB | 6.41x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.54x slower | 375000.0000 | 56000.0000 | 6000.0000 | 2955.5 MB | 8.73x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.01x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.23x slower | 420000.0000 | 42000.0000 | 41000.0000 | 3151.48 MB | 9.88x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.09x faster | 269000.0000 | 42000.0000 | 41000.0000 | 1946.2 MB | 6.10x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.27x slower | 435000.0000 | 42000.0000 | 41000.0000 | 3274.87 MB | 10.27x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.09x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.04x slower | 173000.0000 | 1000.0000 | - | 1386.21 MB | 5.22x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.20x faster | 104000.0000 | 1000.0000 | - | 834.59 MB | 3.14x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.18x slower | 188000.0000 | 1000.0000 | - | 1507.42 MB | 5.67x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.12x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.07x slower | 176000.0000 | 1000.0000 | - | 1409.45 MB | 4.79x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.21x faster | 107000.0000 | 1000.0000 | - | 858.25 MB | 2.92x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.35x slower | 193000.0000 | 1000.0000 | - | 1546.16 MB | 5.26x more |
- Investigate memory usage(s) 🧑💻
- Removed finalizers from several classes
- Added a lightweight Row pooling strategy
- Replaced the
ReadStringimplementation - Prefer returning
ReadOnlyMemory<char>to avoid allocating a new string - Replace uses of
string.Splitin DefinedRange with span-based parsing
- Some code Cleanup
- Sacrificed a little speed..
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 3.95x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.40x slower | 282000.0000 | 46000.0000 | 6000.0000 | 2218.3 MB | 6.55x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.17x slower | 184000.0000 | 48000.0000 | 6000.0000 | 1436.91 MB | 4.24x more |
| NumberCellAsyncExcel_Prime | 100mb.xlsx | 1.41x slower | 283000.0000 | 45000.0000 | 6000.0000 | 2220.04 MB | 6.55x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.01x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.23x slower | 381000.0000 | 42000.0000 | 41000.0000 | 2841.84 MB | 8.91x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.06x faster | 230000.0000 | 42000.0000 | 41000.0000 | 1636.49 MB | 5.13x more |
| NumberCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.28x slower | 396000.0000 | 42000.0000 | 41000.0000 | 2965.24 MB | 9.30x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.12x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.05x slower | 164000.0000 | 1000.0000 | - | 1309.8 MB | 4.93x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.21x faster | 95000.0000 | 1000.0000 | - | 758.17 MB | 2.85x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.17x slower | 179000.0000 | 1000.0000 | - | 1430.96 MB | 5.39x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.10x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.10x slower | 167000.0000 | 1000.0000 | - | 1332.98 MB | 4.53x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.18x faster | 98000.0000 | 1000.0000 | - | 781.82 MB | 2.66x more |
| NumberCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.38x slower | 184000.0000 | 1000.0000 | - | 1469.73 MB | 5.00x more |
- User defined, using the
"A1:B10"or"$A$1:$B$10"syntax
.NET SDK 10.0.100
[Host] : .NET 8.0.22 (8.0.22, 8.0.2225.52707), X64 RyuJIT x86-64-v3
| Method | ranger | Mean | Error | StdDev | Gen0 | Gen1 | Gen2 | Allocated |
|------------ |--------------------- |---------:|---------:|---------:|-------------:|------------:|-----------:|------------:|
| Access100mb | Excel(...)Cells [35] | 9.723 s | 5.482 s | 0.3005 s | 175000.0000 | 98000.0000 | 7000.0000 | 1527.47 MB |
| Access100mb | Excel(...)edXML [33] | 50.658 s | 50.775 s | 2.7831 s | 1248000.0000 | 382000.0000 | 6000.0000 | 10454.98 MB |
| Access100mb | Excel(...)PPlus [30] | 13.308 s | 2.008 s | 0.1101 s | 550000.0000 | 188000.0000 | 13000.0000 | 6227.98 MB |
| Access100mb | Excel(...)Prime [34] | 7.989 s | 2.612 s | 0.1432 s | 110000.0000 | 52000.0000 | 6000.0000 | 841.56 MB |
| Access100mb | Excel(...)Spire [33] | 29.134 s | 10.542 s | 0.5778 s | 1181000.0000 | 448000.0000 | 6000.0000 | 10192.05 MB |
- 1st pass of the performance for Extracting every Cell in XLSB
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------------------ |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsb | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 335.54 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.86x slower | 521000.0000 | 55000.0000 | 3000.0000 | 4148.76 MB | 12.36x more |
| AccessEveryCellExcel_PrimeXlsb | 100mb.xlsb | 2.05x slower | 260000.0000 | 49000.0000 | 3000.0000 | 2065.03 MB | 6.15x more |
| NumberCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.89x slower | 521000.0000 | 55000.0000 | 3000.0000 | 4148.76 MB | 12.36x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsb [30] | baseline | 37000.0000 | 1000.0000 | - | 301.88 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.51x slower | 579000.0000 | - | - | 4622.77 MB | 15.31x more |
| AccessEveryCellExcel_PrimeXlsb | Blank(...).xlsb [30] | 2.07x slower | 268000.0000 | 1000.0000 | - | 2144.35 MB | 7.10x more |
| NumberCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.53x slower | 579000.0000 | 1000.0000 | - | 4622.77 MB | 15.31x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [34] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.87x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [34] | 1.87x slower | 144000.0000 | 1000.0000 | - | 1154.95 MB | 4.40x more |
| NumberCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.94x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [30] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.89x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [30] | 1.82x slower | 144000.0000 | 1000.0000 | - | 1154.95 MB | 4.40x more |
| NumberCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.86x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
- Performance improvements:
- Switched from traditional switch statement to expression-based switch for more efficient dispatch
- Delayed cell object allocation until after record type validation, avoiding unnecessary object creation for invalid records
- Use of
[MethodImpl(MethodImplOptions.AggressiveInlining)] - Detect ASCII-only strings by checking if high byte of each UTF-16 LE code unit is zero
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------------------ |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsb | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 335.54 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.51x slower | 524000.0000 | 58000.0000 | 6000.0000 | 4148.61 MB | 12.36x more |
| AccessEveryCellExcel_PrimeXlsb | 100mb.xlsb | 1.69x slower | 260000.0000 | 49000.0000 | 3000.0000 | 2064.87 MB | 6.15x more |
| NumberCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.53x slower | 524000.0000 | 58000.0000 | 6000.0000 | 4148.61 MB | 12.36x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsb [30] | baseline | 37000.0000 | 1000.0000 | - | 301.88 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.77x slower | 579000.0000 | 1000.0000 | - | 4622.46 MB | 15.31x more |
| AccessEveryCellExcel_PrimeXlsb | Blank(...).xlsb [30] | 2.01x slower | 268000.0000 | 1000.0000 | - | 2144.04 MB | 7.10x more |
| NumberCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.60x slower | 579000.0000 | 1000.0000 | - | 4622.46 MB | 15.31x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [34] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.90x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [34] | 1.79x slower | 144000.0000 | 1000.0000 | - | 1154.95 MB | 4.40x more |
| NumberCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.86x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [30] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.78x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [30] | 1.82x slower | 144000.0000 | 1000.0000 | - | 1154.95 MB | 4.40x more |
| NumberCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.84x slower | 312000.0000 | 1000.0000 | - | 2494.25 MB | 9.51x more |
- Removal of the Conversion options
Number### - Implement "On Demand" conversion
- Slightly slower, but less memory pressure for
xslb
- Slightly slower, but less memory pressure for
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|-------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.30x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.45x slower | 296000.0000 | 40000.0000 | 2000.0000 | 2355.13 MB | 6.95x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.20x slower | 202000.0000 | 49000.0000 | 6000.0000 | 1573.42 MB | 4.65x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.03x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.27x slower | 411000.0000 | 42000.0000 | 41000.0000 | 3078.16 MB | 9.65x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.00x faster | 259000.0000 | 42000.0000 | 41000.0000 | 1872.57 MB | 5.87x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.14x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.06x slower | 177000.0000 | 1000.0000 | - | 1416.69 MB | 5.33x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.22x faster | 108000.0000 | 1000.0000 | - | 865.04 MB | 3.26x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.11x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.12x slower | 180000.0000 | 1000.0000 | - | 1440.2 MB | 4.90x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.15x faster | 111000.0000 | 1000.0000 | - | 888.69 MB | 3.02x more |
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------------------ |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsb | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 335.55 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.74x slower | 541000.0000 | 61000.0000 | 6000.0000 | 4282.9 MB | 12.76x more |
| AccessEveryCellExcel_PrimeXlsb | 100mb.xlsb | 1.85x slower | 277000.0000 | 50000.0000 | 3000.0000 | 2199.17 MB | 6.55x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsb [30] | baseline | 37000.0000 | 1000.0000 | - | 301.88 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.69x slower | 594000.0000 | 1000.0000 | - | 4739.09 MB | 15.70x more |
| AccessEveryCellExcel_PrimeXlsb | Blank(...).xlsb [30] | 2.24x slower | 283000.0000 | 1000.0000 | - | 2260.49 MB | 7.49x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [34] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.89x slower | 313000.0000 | 1000.0000 | - | 2498.07 MB | 9.53x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [34] | 1.89x slower | 145000.0000 | 1000.0000 | - | 1158.76 MB | 4.42x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [30] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.92x slower | 313000.0000 | 1000.0000 | - | 2498.06 MB | 9.53x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [30] | 1.91x slower | 145000.0000 | 1000.0000 | - | 1158.76 MB | 4.42x more |
- Change
GetAllCellsto returnIReadOnlyList<ICell?>? - Make use of more
[MethodImpl(MethodImplOptions.AggressiveOptimization)] - More XLSB benchmarks
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|--------------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.74 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.04x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.35x slower | 296000.0000 | 44000.0000 | 6000.0000 | 2327.23 MB | 6.87x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.15x slower | 199000.0000 | 48000.0000 | 6000.0000 | 1554.39 MB | 4.59x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | 100mb.xlsx | 2.28x slower | 511000.0000 | 39000.0000 | 2000.0000 | 4060.23 MB | 11.99x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.03x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.17x slower | 409000.0000 | 42000.0000 | 41000.0000 | 3062.18 MB | 9.60x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.06x faster | 258000.0000 | 42000.0000 | 41000.0000 | 1856.87 MB | 5.82x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.52x slower | 817000.0000 | 84000.0000 | 83000.0000 | 6146.63 MB | 19.27x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.7 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.10x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.03x slower | 176000.0000 | 1000.0000 | - | 1408.88 MB | 5.30x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.18x faster | 107000.0000 | 1000.0000 | - | 857.35 MB | 3.23x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.21x slower | 354000.0000 | 1000.0000 | - | 2826.03 MB | 10.64x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.08x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.07x slower | 179000.0000 | 1000.0000 | - | 1432.16 MB | 4.87x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.17x faster | 110000.0000 | 1000.0000 | - | 881.01 MB | 2.99x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.24x slower | 359000.0000 | 1000.0000 | - | 2870.21 MB | 9.76x more |
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------------------------- |--------------------- |--------------:|-------------:|------------:|----------:|------------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsb | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 335.55 MB | |
| AccessEveryCellAspose | 100mb.xlsb | 6.46x slower | 1865000.0000 | 127000.0000 | 8000.0000 | 15001.43 MB | 44.71x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.47x slower | 538000.0000 | 60000.0000 | 6000.0000 | 4255.7 MB | 12.68x more |
| AccessEveryCellExcel_PrimeXlsb | 100mb.xlsb | 1.85x slower | 278000.0000 | 53000.0000 | 6000.0000 | 2180.4 MB | 6.50x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | 100mb.xlsb | 3.92x slower | 977000.0000 | 58000.0000 | 6000.0000 | 7735.68 MB | 23.05x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsb [30] | baseline | 37000.0000 | 1000.0000 | - | 301.88 MB | |
| AccessEveryCellAspose | Blank(...).xlsb [30] | 13.37x slower | 2402000.0000 | 617000.0000 | 7000.0000 | 19173.75 MB | 63.51x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.22x slower | 592000.0000 | 1000.0000 | - | 4723.49 MB | 15.65x more |
| AccessEveryCellExcel_PrimeXlsb | Blank(...).xlsb [30] | 2.12x slower | 281000.0000 | 1000.0000 | - | 2244.92 MB | 7.44x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | Blank(...).xlsb [30] | 6.71x slower | 1184000.0000 | - | - | 9449 MB | 31.30x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [34] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAspose | sampl(...).xlsb [34] | 5.96x slower | 947000.0000 | 62000.0000 | 5000.0000 | 7523.41 MB | 28.69x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.70x slower | 312000.0000 | 1000.0000 | - | 2490.42 MB | 9.50x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [34] | 1.88x slower | 144000.0000 | 1000.0000 | - | 1151.14 MB | 4.39x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [34] | 5.40x slower | 624000.0000 | 1000.0000 | - | 4981.47 MB | 19.00x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [30] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAspose | sampl(...).xlsb [30] | 5.93x slower | 959000.0000 | 62000.0000 | 5000.0000 | 7621.49 MB | 29.06x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.61x slower | 312000.0000 | 1000.0000 | - | 2490.43 MB | 9.50x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [30] | 1.89x slower | 144000.0000 | 1000.0000 | - | 1151.14 MB | 4.39x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [30] | 5.42x slower | 624000.0000 | 1000.0000 | - | 4981.4 MB | 19.00x more |
- Clear Mod
- ThreadStringBuilderPool initial Size
- Row ThreadStatic
- Cell Address caching
- Make use of more
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|--------------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.27x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.36x slower | 262000.0000 | 43000.0000 | 6000.0000 | 2054.67 MB | 6.07x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.16x slower | 165000.0000 | 47000.0000 | 6000.0000 | 1281.85 MB | 3.78x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | 100mb.xlsx | 2.31x slower | 446000.0000 | 51000.0000 | 6000.0000 | 3515.36 MB | 10.38x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.02x faster | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.10x slower | 349000.0000 | 42000.0000 | 41000.0000 | 2590.25 MB | 8.12x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.12x faster | 198000.0000 | 42000.0000 | 41000.0000 | 1384.94 MB | 4.34x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.42x slower | 699000.0000 | 84000.0000 | 83000.0000 | 5202.67 MB | 16.31x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.10x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.03x faster | 149000.0000 | 1000.0000 | - | 1195.36 MB | 4.50x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.26x faster | 80000.0000 | 1000.0000 | - | 643.72 MB | 2.42x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.10x slower | 300000.0000 | 1000.0000 | - | 2398.88 MB | 9.03x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.08x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.04x slower | 152000.0000 | 1000.0000 | - | 1218.58 MB | 4.14x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.22x faster | 83000.0000 | 1000.0000 | - | 667.38 MB | 2.27x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.14x slower | 306000.0000 | 1000.0000 | - | 2443.15 MB | 8.31x more |
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------------------------- |--------------------- |--------------:|-------------:|------------:|----------:|------------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsb | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 335.54 MB | |
| AccessEveryCellAspose | 100mb.xlsb | 6.75x slower | 1865000.0000 | 127000.0000 | 8000.0000 | 15000.78 MB | 44.71x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | 100mb.xlsb | 2.47x slower | 538000.0000 | 60000.0000 | 6000.0000 | 4255.7 MB | 12.68x more |
| AccessEveryCellExcel_PrimeXlsb | 100mb.xlsb | 1.83x slower | 278000.0000 | 53000.0000 | 6000.0000 | 2180.4 MB | 6.50x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | 100mb.xlsb | 3.90x slower | 974000.0000 | 53000.0000 | 3000.0000 | 7735.69 MB | 23.05x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsb [30] | baseline | 37000.0000 | 1000.0000 | - | 301.88 MB | |
| AccessEveryCellAspose | Blank(...).xlsb [30] | 13.66x slower | 2402000.0000 | 617000.0000 | 7000.0000 | 19174.9 MB | 63.52x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.16x slower | 592000.0000 | 1000.0000 | - | 4723.49 MB | 15.65x more |
| AccessEveryCellExcel_PrimeXlsb | Blank(...).xlsb [30] | 2.10x slower | 281000.0000 | 1000.0000 | - | 2244.92 MB | 7.44x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | Blank(...).xlsb [30] | 6.70x slower | 1184000.0000 | - | - | 9449 MB | 31.30x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [34] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAspose | sampl(...).xlsb [34] | 6.00x slower | 947000.0000 | 62000.0000 | 5000.0000 | 7523.44 MB | 28.69x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.57x slower | 312000.0000 | 1000.0000 | - | 2490.43 MB | 9.50x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [34] | 1.81x slower | 144000.0000 | 1000.0000 | - | 1151.14 MB | 4.39x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [34] | 5.27x slower | 624000.0000 | 1000.0000 | - | 4981.41 MB | 19.00x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsb [30] | baseline | 32000.0000 | - | - | 262.23 MB | |
| AccessEveryCellAspose | sampl(...).xlsb [30] | 5.87x slower | 959000.0000 | 62000.0000 | 5000.0000 | 7621.47 MB | 29.06x more |
| AccessEveryCellAsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.62x slower | 312000.0000 | 1000.0000 | - | 2490.43 MB | 9.50x more |
| AccessEveryCellExcel_PrimeXlsb | sampl(...).xlsb [30] | 1.80x slower | 144000.0000 | 1000.0000 | - | 1151.14 MB | 4.39x more |
| ParallelEveryCellAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [30] | 5.15x slower | 624000.0000 | 1000.0000 | - | 4981.4 MB | 19.00x more |
- Remove some
AggressiveOptimizationand allowi-cacheto do its job - Implement "Hot-Paths" for cell type access
- Reduce some memory allocations for ReadOnly CellCollections
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|--------------------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| AccessEveryCellSylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.74 MB | |
| AccessEveryCellXlsxHelper | 100mb.xlsx | 4.40x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AccessEveryCellAsyncExcel_Prime | 100mb.xlsx | 1.36x slower | 259000.0000 | 43000.0000 | 6000.0000 | 2029.18 MB | 5.99x more |
| AccessEveryCellExcel_Prime | 100mb.xlsx | 1.17x slower | 162000.0000 | 47000.0000 | 6000.0000 | 1256.28 MB | 3.71x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | 100mb.xlsx | 2.28x slower | 440000.0000 | 50000.0000 | 6000.0000 | 3464.05 MB | 10.23x more |
| | | | | | | | |
| AccessEveryCellSylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| AccessEveryCellXlsxHelper | Blank(...).xlsx [30] | 1.02x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AccessEveryCellAsyncExcel_Prime | Blank(...).xlsx [30] | 1.11x slower | 347000.0000 | 42000.0000 | 41000.0000 | 2566.88 MB | 8.05x more |
| AccessEveryCellExcel_Prime | Blank(...).xlsx [30] | 1.10x faster | 195000.0000 | 42000.0000 | 41000.0000 | 1361.55 MB | 4.27x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.39x slower | 693000.0000 | 83000.0000 | 83000.0000 | 5155.85 MB | 16.17x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.7 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [34] | 1.10x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [34] | 1.02x faster | 148000.0000 | 1000.0000 | - | 1183.96 MB | 4.46x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [34] | 1.24x faster | 79000.0000 | 1000.0000 | - | 632.28 MB | 2.38x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.06x slower | 297000.0000 | 1000.0000 | - | 2375.97 MB | 8.94x more |
| | | | | | | | |
| AccessEveryCellSylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| AccessEveryCellXlsxHelper | sampl(...).xlsx [30] | 1.09x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AccessEveryCellAsyncExcel_Prime | sampl(...).xlsx [30] | 1.01x slower | 151000.0000 | 1000.0000 | - | 1207.21 MB | 4.10x more |
| AccessEveryCellExcel_Prime | sampl(...).xlsx [30] | 1.22x faster | 82000.0000 | 1000.0000 | - | 655.93 MB | 2.23x more |
| ParallelEveryCellAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.10x slower | 303000.0000 | 1000.0000 | - | 2420.25 MB | 8.23x more |
- Internal implementation of
IOpenXmlWorkBookReader::GetSheetNamesnow returns the relative path to the sheetName
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------ |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| Sylvan | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 4.24x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.39x slower | 259000.0000 | 43000.0000 | 6000.0000 | 2029.28 MB | 5.99x more |
| Excel_Prime | 100mb.xlsx | 1.19x slower | 162000.0000 | 47000.0000 | 6000.0000 | 1256.38 MB | 3.71x more |
| PrlAsyncExcel_PrimeTwice| 100mb.xlsx | 2.27x slower | 440000.0000 | 50000.0000 | 6000.0000 | 3464.3 MB | 10.23x more |
| | | | | | | | |
| Sylvan | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.01x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.08x slower | 347000.0000 | 42000.0000 | 41000.0000 | 2566.97 MB | 8.05x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.11x faster | 195000.0000 | 42000.0000 | 41000.0000 | 1361.65 MB | 4.27x more |
| PrlAsyncExcel_PrimeTwice| Blank(...).xlsx [30] | 2.40x slower | 693000.0000 | 85000.0000 | 83000.0000 | 5155.95 MB | 16.17x more |
| | | | | | | | |
| Sylvan | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.12x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.04x faster | 148000.0000 | 1000.0000 | - | 1184.05 MB | 4.46x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.25x faster | 79000.0000 | 1000.0000 | - | 632.38 MB | 2.38x more |
| PrlAsyncExcel_PrimeTwice| sampl(...).xlsx [34] | 2.05x slower | 297000.0000 | 1000.0000 | - | 2376.06 MB | 8.94x more |
| | | | | | | | |
| Sylvan | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.09x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.03x slower | 151000.0000 | 1000.0000 | - | 1207.31 MB | 4.10x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.22x faster | 82000.0000 | 1000.0000 | - | 656.03 MB | 2.23x more |
| PrlAsyncExcel_PrimeTwice| sampl(...).xlsx [30] | 2.17x slower | 303000.0000 | - | - | 2420.4 MB | 8.23x more |
- Use
Taskand reduce memory allocations in some hot paths
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.73 MB | |
| XlsxHelper | 100mb.xlsx | 4.07x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.34x slower | 249000.0000 | 43000.0000 | 6000.0000 | 1952.64 MB | 5.76x more |
| Excel_Prime | 100mb.xlsx | 1.14x slower | 162000.0000 | 47000.0000 | 6000.0000 | 1256.38 MB | 3.71x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.27x slower | 421000.0000 | 50000.0000 | 6000.0000 | 3312.2 MB | 9.78x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.02x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.13x slower | 338000.0000 | 42000.0000 | 41000.0000 | 2496.88 MB | 7.83x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.11x faster | 195000.0000 | 42000.0000 | 41000.0000 | 1361.65 MB | 4.27x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.44x slower | 676000.0000 | 83000.0000 | 83000.0000 | 5018.12 MB | 15.74x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.06x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.01x faster | 144000.0000 | - | - | 1149.7 MB | 4.33x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.23x faster | 79000.0000 | 1000.0000 | - | 632.38 MB | 2.38x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.07x slower | 289000.0000 | 1000.0000 | - | 2308.61 MB | 8.69x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.10x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.05x slower | 147000.0000 | 1000.0000 | - | 1172.93 MB | 3.99x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.24x faster | 82000.0000 | 1000.0000 | - | 656.03 MB | 2.23x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.10x slower | 294000.0000 | 1000.0000 | - | 2352.57 MB | 8.00x more |
- Fix fallout from making
CellValueis now aclass
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 43000.0000 | 41000.0000 | 5000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 4.18x slower | 424000.0000 | 5000.0000 | 2000.0000 | 3380.59 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.37x slower | 275000.0000 | 43000.0000 | 6000.0000 | 2157.06 MB | 6.37x more |
| Excel_Prime | 100mb.xlsx | 1.18x slower | 187000.0000 | 48000.0000 | 6000.0000 | 1460.79 MB | 4.31x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.26x slower | 472000.0000 | 48000.0000 | 6000.0000 | 3720.94 MB | 10.99x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 40000.0000 | 2000.0000 | 1000.0000 | 318.93 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.03x slower | 218000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.10x slower | 382000.0000 | 42000.0000 | 41000.0000 | 2850.86 MB | 8.94x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.05x faster | 240000.0000 | 42000.0000 | 41000.0000 | 1715.6 MB | 5.38x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.40x slower | 765000.0000 | 83000.0000 | 83000.0000 | 5726.15 MB | 17.95x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 33000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.09x faster | 100000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.02x faster | 164000.0000 | 1000.0000 | - | 1309.98 MB | 4.93x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.18x faster | 99000.0000 | 1000.0000 | - | 792.6 MB | 2.98x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.07x slower | 329000.0000 | 1000.0000 | - | 2629.01 MB | 9.90x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 36000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.09x faster | 93000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.02x slower | 167000.0000 | 1000.0000 | - | 1333.24 MB | 4.53x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.19x faster | 102000.0000 | 1000.0000 | - | 816.25 MB | 2.77x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.11x slower | 335000.0000 | 1000.0000 | - | 2673.03 MB | 9.09x more |
- Change the Cell type back to a
record - Add Formatting Style tests
- Update testing nugets
- Mark as Beta
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 29000.0000 | 27000.0000 | 4000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 3.67x slower | 282000.0000 | 2000.0000 | 1000.0000 | 3380.58 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.32x slower | 184000.0000 | 36000.0000 | 5000.0000 | 2157.12 MB | 6.37x more |
| Excel_Prime | 100mb.xlsx | 1.17x slower | 126000.0000 | 34000.0000 | 5000.0000 | 1460.77 MB | 4.31x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.19x slower | 315000.0000 | 42000.0000 | 5000.0000 | 3720.82 MB | 10.99x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 27000.0000 | 2000.0000 | 1000.0000 | 318.92 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.00x faster | 145000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.11x slower | 268000.0000 | 42000.0000 | 41000.0000 | 2850.86 MB | 8.94x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.04x faster | 173000.0000 | 42000.0000 | 41000.0000 | 1715.59 MB | 5.38x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.53x slower | 538000.0000 | 83000.0000 | 83000.0000 | 5726.03 MB | 17.95x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 22000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.08x faster | 66000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.02x faster | 109000.0000 | 1000.0000 | - | 1309.97 MB | 4.93x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.14x faster | 66000.0000 | 1000.0000 | - | 792.59 MB | 2.98x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.00x slower | 219000.0000 | 1000.0000 | - | 2628.99 MB | 9.90x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 24000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.05x faster | 62000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.01x slower | 111000.0000 | 1000.0000 | - | 1333.28 MB | 4.53x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.15x faster | 68000.0000 | 1000.0000 | - | 816.25 MB | 2.77x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 1.99x slower | 223000.0000 | 1000.0000 | - | 2673.04 MB | 9.09x more |
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|----------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsb | baseline | 29000.0000 | 28000.0000 | 4000.0000 | 335.55 MB | |
| AsyncExcel_PrimeXlsb | 100mb.xlsb | 2.22x slower | 360000.0000 | 42000.0000 | 5000.0000 | 4264.26 MB | 12.71x more |
| Excel_PrimeXlsb | 100mb.xlsb | 1.68x slower | 193000.0000 | 43000.0000 | 5000.0000 | 2265.57 MB | 6.75x more |
| PrlAsyncExcel_PrimeXlsbTwice | 100mb.xlsb | 3.51x slower | 655000.0000 | 48000.0000 | 6000.0000 | 7752.78 MB | 23.10x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsb [30] | baseline | 25000.0000 | 1000.0000 | - | 301.88 MB | |
| AsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.17x slower | 403000.0000 | 1000.0000 | - | 4828.05 MB | 15.99x more |
| Excel_PrimeXlsb | Blank(...).xlsb [30] | 2.17x slower | 202000.0000 | 1000.0000 | - | 2419.62 MB | 8.02x more |
| PrlAsyncExcel_PrimeXlsbTwice | Blank(...).xlsb [30] | 6.83x slower | 807000.0000 | 1000.0000 | - | 9658.44 MB | 31.99x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsb [34] | baseline | 21000.0000 | - | - | 262.23 MB | |
| AsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.53x slower | 212000.0000 | 1000.0000 | - | 2540.16 MB | 9.69x more |
| Excel_PrimeXlsb | sampl(...).xlsb [34] | 1.74x slower | 103000.0000 | 1000.0000 | - | 1235.15 MB | 4.71x more |
| PrlAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [34] | 5.16x slower | 424000.0000 | 1000.0000 | - | 5080.9 MB | 19.38x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsb [30] | baseline | 21000.0000 | - | - | 262.23 MB | |
| AsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.52x slower | 212000.0000 | 1000.0000 | - | 2540.16 MB | 9.69x more |
| Excel_PrimeXlsb | sampl(...).xlsb [30] | 1.71x slower | 103000.0000 | 1000.0000 | - | 1235.15 MB | 4.71x more |
| PrlAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [30] | 5.04x slower | 424000.0000 | 1000.0000 | - | 5080.9 MB | 19.38x more |
- Remove
inusages (Supposed to not benefit !) - Make use of ThreadStatic in XlsbRow
- Remove secoundary usage of a struct
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 29000.0000 | 27000.0000 | 4000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 3.60x slower | 282000.0000 | 2000.0000 | 1000.0000 | 3380.58 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.30x slower | 184000.0000 | 36000.0000 | 5000.0000 | 2157.11 MB | 6.37x more |
| Excel_Prime | 100mb.xlsx | 1.16x slower | 126000.0000 | 34000.0000 | 5000.0000 | 1460.77 MB | 4.31x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.08x slower | 315000.0000 | 42000.0000 | 5000.0000 | 3720.81 MB | 10.98x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 27000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.01x slower | 145000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.12x slower | 268000.0000 | 42000.0000 | 41000.0000 | 2850.85 MB | 8.94x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.05x faster | 173000.0000 | 42000.0000 | 41000.0000 | 1715.59 MB | 5.38x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.52x slower | 538000.0000 | 83000.0000 | 83000.0000 | 5726.04 MB | 17.96x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 22000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.08x faster | 66000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.02x faster | 109000.0000 | 1000.0000 | - | 1309.96 MB | 4.93x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.17x faster | 66000.0000 | 1000.0000 | - | 792.59 MB | 2.98x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.35x slower | 219000.0000 | 1000.0000 | - | 2628.94 MB | 9.90x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 24000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.07x faster | 62000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.02x slower | 111000.0000 | 1000.0000 | - | 1333.23 MB | 4.53x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.17x faster | 68000.0000 | 1000.0000 | - | 816.25 MB | 2.77x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.06x slower | 223000.0000 | 1000.0000 | - | 2672.97 MB | 9.09x more |
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|----------------------------- |--------------------- |-------------:|------------:|-----------:|----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsb | baseline | 29000.0000 | 28000.0000 | 4000.0000 | 335.55 MB | |
| AsyncExcel_PrimeXlsb | 100mb.xlsb | 2.27x slower | 360000.0000 | 42000.0000 | 5000.0000 | 4264.26 MB | 12.71x more |
| Excel_PrimeXlsb | 100mb.xlsb | 1.66x slower | 193000.0000 | 43000.0000 | 5000.0000 | 2265.57 MB | 6.75x more |
| PrlAsyncExcel_PrimeXlsbTwice | 100mb.xlsb | 3.57x slower | 654000.0000 | 51000.0000 | 6000.0000 | 7752.75 MB | 23.10x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsb [30] | baseline | 25000.0000 | 1000.0000 | - | 301.88 MB | |
| AsyncExcel_PrimeXlsb | Blank(...).xlsb [30] | 3.22x slower | 403000.0000 | 1000.0000 | - | 4828.05 MB | 15.99x more |
| Excel_PrimeXlsb | Blank(...).xlsb [30] | 2.07x slower | 202000.0000 | 1000.0000 | - | 2419.62 MB | 8.02x more |
| PrlAsyncExcel_PrimeXlsbTwice | Blank(...).xlsb [30] | 6.81x slower | 807000.0000 | 1000.0000 | - | 9658.44 MB | 31.99x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsb [34] | baseline | 21000.0000 | - | - | 262.23 MB | |
| AsyncExcel_PrimeXlsb | sampl(...).xlsb [34] | 2.49x slower | 212000.0000 | 1000.0000 | - | 2540.16 MB | 9.69x more |
| Excel_PrimeXlsb | sampl(...).xlsb [34] | 1.72x slower | 103000.0000 | 1000.0000 | - | 1235.15 MB | 4.71x more |
| PrlAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [34] | 5.06x slower | 424000.0000 | 1000.0000 | - | 5080.9 MB | 19.38x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsb [30] | baseline | 21000.0000 | - | - | 262.23 MB | |
| AsyncExcel_PrimeXlsb | sampl(...).xlsb [30] | 2.51x slower | 212000.0000 | 1000.0000 | - | 2540.16 MB | 9.69x more |
| Excel_PrimeXlsb | sampl(...).xlsb [30] | 1.71x slower | 103000.0000 | 1000.0000 | - | 1235.15 MB | 4.71x more |
| PrlAsyncExcel_PrimeXlsbTwice | sampl(...).xlsb [30] | 5.09x slower | 424000.0000 | 1000.0000 | - | 5080.97 MB | 19.38x more |
- Implement
System.DBNullreturn option, for empty cells - Mark up usage of userdefined cells styles for V5
-
- Update "Sylvan.Data.Excel" to Version="0.5.5"
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 29000.0000 | 27000.0000 | 4000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 5.00x slower | 282000.0000 | 6000.0000 | 2000.0000 | 3380.58 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.36x slower | 184000.0000 | 36000.0000 | 5000.0000 | 2156.93 MB | 6.37x more |
| Excel_Prime | 100mb.xlsx | 1.23x slower | 126000.0000 | 34000.0000 | 5000.0000 | 1460.77 MB | 4.31x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.24x slower | 315000.0000 | 42000.0000 | 5000.0000 | 3719.5 MB | 10.98x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 26000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.08x slower | 145000.0000 | 2000.0000 | 1000.0000 | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.07x slower | 268000.0000 | 43000.0000 | 42000.0000 | 2850.56 MB | 8.94x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.02x faster | 173000.0000 | 43000.0000 | 42000.0000 | 1715.59 MB | 5.38x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.46x slower | 538000.0000 | 86000.0000 | 83000.0000 | 5724.28 MB | 17.95x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 22000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.08x faster | 66000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.02x faster | 109000.0000 | 1000.0000 | - | 1309.88 MB | 4.93x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.16x faster | 66000.0000 | 1000.0000 | - | 792.59 MB | 2.98x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.15x slower | 219000.0000 | 2000.0000 | - | 2628.26 MB | 9.89x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 24000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.04x faster | 62000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.08x slower | 111000.0000 | 1000.0000 | - | 1333.13 MB | 4.53x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.06x faster | 68000.0000 | 1000.0000 | - | 816.25 MB | 2.77x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.30x slower | 223000.0000 | 2000.0000 | - | 2671.72 MB | 9.08x more |
- Release-specific optimizations added
- EnableTrimAnalyzer: true
- TieredCompilation: true
- TieredCompilationQuickJit: true
- TieredCompilationQuickJitForLoops: true
- Implement
System.DBNullreturn option, for empty cells- Implement
INullRowreturn option, for empty rows - Update tests to use
INullRowdetection
- Implement
- Implement
GetCell###(string columnLetters, ...)#8 ArrayPoolsupport has been added to ThreadStringBuilderPool using ArrayPool.
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 29000.0000 | 27000.0000 | 4000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 3.60x slower | 282000.0000 | 2000.0000 | 1000.0000 | 3380.58 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.28x slower | 184000.0000 | 36000.0000 | 5000.0000 | 2151.64 MB | 6.35x more |
| Excel_Prime | 100mb.xlsx | 1.15x slower | 126000.0000 | 34000.0000 | 5000.0000 | 1459.35 MB | 4.31x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.14x slower | 314000.0000 | 42000.0000 | 5000.0000 | 3709.95 MB | 10.95x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 27000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.05x slower | 145000.0000 | 1000.0000 | - | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.13x slower | 268000.0000 | 42000.0000 | 41000.0000 | 2850.83 MB | 8.94x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.01x slower | 173000.0000 | 42000.0000 | 41000.0000 | 1715.59 MB | 5.38x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.56x slower | 538000.0000 | 83000.0000 | 83000.0000 | 5726.2 MB | 17.96x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 22000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.09x faster | 66000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.00x slower | 109000.0000 | 1000.0000 | - | 1309.97 MB | 4.93x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.17x faster | 66000.0000 | 1000.0000 | - | 792.59 MB | 2.98x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.18x slower | 219000.0000 | 1000.0000 | - | 2629.08 MB | 9.90x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 24000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.08x faster | 62000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.02x slower | 111000.0000 | 1000.0000 | - | 1333.29 MB | 4.53x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.16x faster | 68000.0000 | 1000.0000 | - | 816.25 MB | 2.77x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.09x slower | 223000.0000 | 1000.0000 | - | 2672.97 MB | 9.09x more |
- Small tweaks for performance
- Remove
<PublishReadyToRun>true</PublishReadyToRun> - Supports zero-allocation formatting on .NET 8+ via ISpanFormattable.
- Cache allocation of the internal buffer for the StringBuilder in ThreadStringBuilderPool, to avoid the first allocation on each thread.
- Remove
| Method | FileName | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio |
|------------------------- |--------------------- |-------------:|------------:|-----------:|-----------:|-----------:|------------:|
| SylvanRdr | 100mb.xlsx | baseline | 29000.0000 | 27000.0000 | 4000.0000 | 338.72 MB | |
| XlsxHelper | 100mb.xlsx | 4.80x slower | 282000.0000 | 4000.0000 | 1000.0000 | 3380.58 MB | 9.98x more |
| AsyncExcel_Prime | 100mb.xlsx | 1.31x slower | 184000.0000 | 36000.0000 | 5000.0000 | 2151.38 MB | 6.35x more |
| Excel_Prime | 100mb.xlsx | 1.28x slower | 126000.0000 | 34000.0000 | 5000.0000 | 1459.35 MB | 4.31x more |
| PrlAsyncExcel_PrimeTwice | 100mb.xlsx | 2.36x slower | 314000.0000 | 42000.0000 | 5000.0000 | 3706.94 MB | 10.94x more |
| | | | | | | | |
| SylvanRdr | Blank(...).xlsx [30] | baseline | 26000.0000 | 2000.0000 | 1000.0000 | 318.9 MB | |
| XlsxHelper | Blank(...).xlsx [30] | 1.05x slower | 145000.0000 | 2000.0000 | 1000.0000 | 1739.24 MB | 5.45x more |
| AsyncExcel_Prime | Blank(...).xlsx [30] | 1.10x slower | 268000.0000 | 43000.0000 | 42000.0000 | 2850.63 MB | 8.94x more |
| Excel_Prime | Blank(...).xlsx [30] | 1.00x slower | 173000.0000 | 43000.0000 | 42000.0000 | 1715.59 MB | 5.38x more |
| PrlAsyncExcel_PrimeTwice | Blank(...).xlsx [30] | 2.33x slower | 537000.0000 | 85000.0000 | 83000.0000 | 5721.11 MB | 17.94x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [34] | baseline | 22000.0000 | - | - | 265.67 MB | |
| XlsxHelper | sampl(...).xlsx [34] | 1.08x faster | 66000.0000 | - | - | 799.73 MB | 3.01x more |
| AsyncExcel_Prime | sampl(...).xlsx [34] | 1.13x faster | 109000.0000 | 1000.0000 | - | 1309.89 MB | 4.93x more |
| Excel_Prime | sampl(...).xlsx [34] | 1.13x faster | 66000.0000 | 1000.0000 | - | 792.59 MB | 2.98x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [34] | 2.10x slower | 219000.0000 | 2000.0000 | - | 2626.55 MB | 9.89x more |
| | | | | | | | |
| SylvanRdr | sampl(...).xlsx [30] | baseline | 24000.0000 | - | - | 294.16 MB | |
| XlsxHelper | sampl(...).xlsx [30] | 1.01x faster | 62000.0000 | - | - | 742.13 MB | 2.52x more |
| AsyncExcel_Prime | sampl(...).xlsx [30] | 1.09x slower | 111000.0000 | 1000.0000 | - | 1333.1 MB | 4.53x more |
| Excel_Prime | sampl(...).xlsx [30] | 1.07x faster | 68000.0000 | 1000.0000 | - | 816.25 MB | 2.77x more |
| PrlAsyncExcel_PrimeTwice | sampl(...).xlsx [30] | 2.10x slower | 223000.0000 | 1000.0000 | - | 2671.4 MB | 9.08x more |