Skip to content

Refresh benchmark docs, add large-sheet benchmarks, parse decimals faster - #147

Merged
GabrielMarquezMatte merged 9 commits into
masterfrom
develop
Oct 16, 2026
Merged

GabrielMarquezMatte merged 9 commits into
masterfrom
develop

Conversation

@GabrielMarquezMatte

Copy link
Copy Markdown
Owner

What does this change?

Documents how 7.0.0 performs, adds benchmarks for the parallel paths at their largest sizes, and speeds up decimal parsing. None of it changes the public API, so the FastDecimal change can go out in a patch release.

  • Benchmark docs. docs/performance/benchmarks.md, the guides that quote it and the README are refreshed from a full --job Short run on the Ryzen 7 5700X (.NET 10.0.12). Rows whose Short interval was wider than 25% of the mean were rerun on --job Medium. There is a new "Large sheets" section, and "Parallel record writes" now comes from BenchmarkDotNet instead of a console harness. Every parallel row shows its allocation.
  • New benchmarks.
    • ParallelRecordWriteBenchmark: 1,000,000 rows to a MemoryStream, serial, PrefetchWrite and WriteRecordsParallelAsync at 1 to 16 batches in flight, XLSX and XLSB.
    • LargeSheetParallelBenchmark: sheets generated in memory at the formats' limits (1,000,000 rows for XLSX and XLSB, 4,000,000 for CSV), SheetParallel.AggregateAsync and ParseAsync at dop 1 to 16. The CSV aggregate shows the allocation-free path next to the typed one.
    • Both are in benchmark-groups.json; CsvGenerator gains BuildConversionHeavy, sharing code with the file writer.
  • FastDecimal. Cell.TryParse<decimal> first tries a small ASCII parser (up to 19 digits, optional sign and one ., when the culture uses .) and falls back to the existing path for anything else. The result is bit-identical to decimal.Parse, scale included (1.50 stays 1.50). Other types are unaffected: the branch is folded away per generic instantiation.
  • Bookkeeping after 7.0.0. The entries in PublicAPI.Unshipped.txt move to PublicAPI.Shipped.txt, and PackageValidationBaselineVersion goes from 7.0.0-rc.2 to 7.0.0. No API is added or removed.

What the new numbers change in the published claims:

  • OfficeIMO.Excel 3.4.5 reads XLSX several times faster than the figures published before (14.4 ms against 106.9 ms on the 50,000-row read). The lead over it drops from ~15.6x to ~2.1x on reads, and typed parsing is close to parity (11.0 ms against 11.8 ms, and it allocates less).
  • Conversion-heavy CSV is up to ~35% faster at low dop thanks to FastDecimal. The ordered typed parse gets slower from dop 8 to 16 because of gen1 collections, and the doc now says so (DOTNET_gcServer=1 halves it in a console harness). The aggregate path is unaffected.
  • First-use typed parsing is ~6 ms slower than the 40.7 ms that was published (now 46.6 ms). It is JIT of the managed inflate decoder and CRC verification during open, not parsing and not FastDecimal. The cold-start table has the new figures.

Checklist

  • dotnet build ExcelReader.slnx --configuration Release builds clean (warnings are errors)
  • dotnet test tests/ExcelReader.Tests/ExcelReader.Tests.csproj --configuration Release passes
  • If this changes the public API: PublicAPI.Unshipped.txt updated (nothing added; shipped entries moved)
  • Tests added/updated for the behavior change (FastDecimalTests)
  • One focused change — unrelated fixes are in a separate PR

Test plan

  • FastDecimalTests: bit-exact against decimal.Parse, plus rejection cases that must fall back.
  • The benchmark project builds in Release with 0 errors and check-benchmark-groups.sh reports every benchmark covered. Both new classes ran end to end under BenchmarkDotNet (--job Medium, 44 benchmarks, error 0 to 6%, one at 12%).
  • The numbers in the docs come from those runs.

GabrielMarquezMatte and others added 7 commits October 15, 2026 14:29
…-api-v7.0.0

chore: promote public API for v7.0.0
Short run of the whole suite on the idle Ryzen 7 5700X (.NET 10.0.12),
with the rows whose Short interval exceeded 25% of the mean rerun on
MediumRun. OfficeIMO.Excel 3.4.5 reads XLSX several times faster than
the figures published before; the conversion-heavy CSV parallel path
gained from FastDecimal but is allocator-bound at dop 16.
@GabrielMarquezMatte GabrielMarquezMatte added the run-benchmarks Run the benchmark suite on this PR label Oct 16, 2026
@codecov-commenter

codecov-commenter commented Oct 16, 2026 •

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 91.06%. Comparing base (52aa42e) to head (282e8b9).
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.

Additional details and impacted files
@@           Coverage Diff           @@
##           master     #147   +/-   ##
=======================================
  Coverage   91.06%   91.06%           
=======================================
  Files         251      252    +1     
  Lines       17472    17501   +29     
  Branches     3153     3162    +9     
=======================================
+ Hits        15911    15938   +27     
- Misses       1070     1072    +2     
  Partials      491      491           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

crates.io has yanked every zip release except 9.0.3. calamine 0.36.1 needs
zip ^8.6 and rust_xlsxwriter 0.99.1 needs zip ^8.3, so a fresh resolution
fails ("version 8.6.0 is yanked") and every Rust CI job with it. Cargo keeps
a yanked version that a lockfile already holds, so committing the lock
restores CI until both crates move to zip 9. They are dev-dependencies of
the comparison benchmarks only; nothing ships with zip.
@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Benchmark Results

Baseline: master 52aa42e5, from the series published by benchmark-pages.yml. Both sides ran on a shared ubuntu-latest runner, so treat anything under ±10% as noise.

Moved by at least 10%

Benchmark master This PR Delta
ExcelReader.Benchmarks.CsvReadBenchmark.Sylvan(Rows: 50000) 3.37 ms 6.66 ms +97.7%
ExcelReader.Benchmarks.CsvReadBenchmark.Sep(Rows: 50000) 7.37 ms 13.52 ms +83.6%
ExcelReader.Benchmarks.ReadBenchmark.ExcelReaderAsync(Rows: 50000) 6.74 ms 11.87 ms +76.2%
ExcelReader.Benchmarks.ReadBenchmark.ExcelReader(Rows: 50000) 6.47 ms 11.28 ms +74.2%
ExcelReader.Benchmarks.XlsReadBenchmark.Sylvan(Rows: 50000) 5.09 ms 8.80 ms +72.8%
ExcelReader.Benchmarks.CsvReadBenchmark.ExcelReaderAsync(Rows: 50000) 2.36 ms 4.01 ms +69.7%
ExcelReader.Benchmarks.XlsReadBenchmark.ExcelReader(Rows: 50000) 3.17 ms 5.36 ms +69.0%
ExcelReader.Benchmarks.ReadBenchmark.ExcelReaderMaterialized(Rows: 50000) 7.57 ms 12.79 ms +68.9%
ExcelReader.Benchmarks.CsvReadBenchmark.ExcelReader(Rows: 50000) 2.33 ms 3.90 ms +67.8%
ExcelReader.Benchmarks.XlsReadBenchmark.ExcelReaderAsync(Rows: 50000) 3.04 ms 4.89 ms +61.0%
ExcelReader.Benchmarks.ReadBenchmark.ExcelReaderXlsbAsync(Rows: 50000) 4.30 ms 6.89 ms +60.2%
ExcelReader.Benchmarks.ReadBenchmark.OfficeIMOXlsb(Rows: 50000) 10.51 ms 16.79 ms +59.7%
ExcelReader.Benchmarks.ReadBenchmark.ExcelReaderXlsb(Rows: 50000) 4.18 ms 6.47 ms +54.8%
ExcelReader.Benchmarks.CsvReadBenchmark.ExcelReaderWide(Rows: 50000) 8.02 ms 12.25 ms +52.6%
ExcelReader.Benchmarks.ReadBenchmark.Sylvan(Rows: 50000) 36.96 ms 56.32 ms +52.4%
ExcelReader.Benchmarks.ArrowConversionBenchmark.CsvAllString(Rows: 100000) 21.85 ms 31.32 ms +43.4%
ExcelReader.Benchmarks.ReadBenchmark.OfficeIMO(Rows: 50000) 14.28 ms 19.78 ms +38.5%
ExcelReader.Benchmarks.ArrowConversionBenchmark.CsvTyped(Rows: 100000) 13.16 ms 17.83 ms +35.5%
ExcelReader.Benchmarks.XlsReadBenchmark.OfficeIMO(Rows: 50000) 8.24 ms 11.04 ms +34.0%
ExcelReader.Benchmarks.DataReaderBenchmark.DataReader_GetBytes(Rows: 50000) 8.12 ms 10.55 ms +30.0%
ExcelReader.Benchmarks.DataReaderBenchmark.DataReader_GetValue(Rows: 50000) 10.79 ms 13.94 ms +29.1%
ExcelReader.Benchmarks.ArrowConversionBenchmark.XlsbTyped(Rows: 100000) 16.89 ms 21.69 ms +28.4%
ExcelReader.Benchmarks.ArrowConversionBenchmark.CsvTypedWithInference(Rows: 100000) 12.28 ms 15.73 ms +28.0%
ExcelReader.Benchmarks.InflateBenchmark.XlsxSheet_InflateStream 15.80 ms 20.14 ms +27.5%
ExcelReader.Benchmarks.DataReaderBenchmark.DataTable_Load(Rows: 50000) 61.87 ms 78.58 ms +27.0%
ExcelReader.Benchmarks.DataReaderBenchmark.Baseline_RawRows(Rows: 50000) 7.75 ms 9.81 ms +26.6%
ExcelReader.Benchmarks.EncryptedWorkbookBenchmark.Plain_Stream 50.13 µs 59.84 µs +19.4%
ExcelReader.Benchmarks.InflateBenchmark.XlsbSheet_InflateStream 11.20 ms 13.29 ms +18.7%
ExcelReader.Benchmarks.DataReaderBenchmark.DataReader_TypedGetters(Rows: 50000) 10.70 ms 12.61 ms +17.8%
ExcelReader.Benchmarks.InflateBenchmark.SharedStrings_InflateStream 7.20 ms 8.28 ms +15.0%
ExcelReader.Benchmarks.SheetParallelBenchmark.Xlsx_Aggregate(Dop: 8) 37.39 ms 42.21 ms +12.9%
ExcelReader.Benchmarks.InflateBenchmark.SharedStrings_DeflateStream 13.50 ms 15.22 ms +12.7%
ExcelReader.Benchmarks.SheetParallelBenchmark.Xlsx_Aggregate(Dop: 4) 37.49 ms 41.74 ms +11.3%
ExcelReader.Benchmarks.InflateBenchmark.XlsbSheet_DeflateStream 16.51 ms 18.32 ms +11.0%
ExcelReader.Benchmarks.StringHeavyReadBenchmark.Xlsx_ExcelReader_Materialized(Rows: 65536) 53.15 ms 47.19 ms -11.2%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "csv", ReadRows: False) 8.05 µs 7.05 µs -12.4%
ExcelReader.Benchmarks.EncryptedWorkbookBenchmark.Encrypted_OpenOnly 69.43 ms 59.97 ms -13.6%
ExcelReader.Benchmarks.EncryptedWorkbookBenchmark.Encrypted_Stream 69.17 ms 58.39 ms -15.6%
ExcelReader.Benchmarks.EncryptedWorkbookBenchmark.Encrypted_Stream_VerifyIntegrity 69.81 ms 58.27 ms -16.5%
ExcelReader.Benchmarks.EncryptedWorkbookBenchmark.Large_Encrypted_OpenOnly 69.38 ms 57.33 ms -17.4%
ExcelReader.Benchmarks.StringHeavyReadBenchmark.Xlsx_ExcelReader_Materialized_Interned(Rows: 65536) 59.60 ms 48.49 ms -18.6%
ExcelReader.Benchmarks.StringHeavyReadBenchmark.Xlsb_Sylvan(Rows: 65536) 66.88 ms 52.37 ms -21.7%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "xlsx", ReadRows: False) 1.23 ms 962.20 µs -21.7%
ExcelReader.Benchmarks.ParseBenchmark.SylvanAsync(Rows: 50000) 94.26 ms 73.22 ms -22.3%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.Sep_Sequential(Corpus: NarrowInt) 598.81 ms 463.34 ms -22.6%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowInt(Dop: 1) 827.12 ms 636.35 ms -23.1%
ExcelReader.Benchmarks.ParseBenchmark.OfficeIMO(Rows: 50000) 17.11 ms 13.03 ms -23.8%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "xlsb", ReadRows: False) 1.67 ms 1.25 ms -25.1%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "xls", ReadRows: False) 226.45 µs 169.19 µs -25.3%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.ExcelReader_Sequential(Corpus: NarrowInt) 721.09 ms 538.53 ms -25.3%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "xlsx", ReadRows: False) 1.85 ms 1.37 ms -26.0%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowInt(Dop: 8) 462.11 ms 341.63 ms -26.1%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.ExcelReader_Parallel(Corpus: NarrowInt) 463.44 ms 337.35 ms -27.2%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.Sep_Parallel(Corpus: NarrowInt) 463.19 ms 336.55 ms -27.3%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "xls", ReadRows: False) 2.28 ms 1.64 ms -28.1%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowInt(Dop: 4) 472.17 ms 338.27 ms -28.4%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowInt(Dop: 16) 457.57 ms 325.97 ms -28.8%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.Sep_Parallel(Corpus: ConversionHeavy) 813.83 ms 576.89 ms -29.1%
ExcelReader.Benchmarks.ParseBenchmark.Sylvan(Rows: 50000) 89.38 ms 63.23 ms -29.3%
ExcelReader.Benchmarks.ParseBenchmark.ExcelParserSync(Rows: 50000) 15.86 ms 11.02 ms -30.5%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "csv", ReadRows: False) 1.23 ms 849.52 µs -30.7%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowIntAggregate(Dop: 16) 306.08 ms 211.36 ms -30.9%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.Sep_Sequential(Corpus: ConversionHeavy) 1.14 s 784.77 ms -31.1%
ExcelReader.Benchmarks.CsvParseBenchmark.ExcelParserAsync(Rows: 50000) 7.26 ms 5.00 ms -31.2%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "csv", ReadRows: False) 224 ns 154 ns -31.4%
ExcelReader.Benchmarks.ParseBenchmark.ExcelParserXlsbAsync(Rows: 50000) 10.90 ms 7.46 ms -31.6%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowIntAggregate(Dop: 4) 312.32 ms 212.74 ms -31.9%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowIntAggregate(Dop: 2) 497.46 ms 337.30 ms -32.2%
ExcelReader.Benchmarks.NativeRowReadBenchmark.NextRowBlob 48.53 ms 32.89 ms -32.2%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowIntAggregate(Dop: 8) 316.57 ms 214.05 ms -32.4%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowInt(Dop: 2) 706.70 ms 476.57 ms -32.6%
ExcelReader.Benchmarks.CsvParseBenchmark.ExcelParserSync(Rows: 50000) 7.00 ms 4.72 ms -32.6%
ExcelReader.Benchmarks.NativeRowReadBenchmark.ReadAllBlob 54.34 ms 36.34 ms -33.1%
ExcelReader.Benchmarks.ParseBenchmark.ExcelParserXlsbSync(Rows: 50000) 11.01 ms 7.33 ms -33.5%
ExcelReader.Benchmarks.ParseBenchmark.ExcelParserSyncSharedStrings(Rows: 50000) 14.77 ms 9.82 ms -33.5%
ExcelReader.Benchmarks.NativeRowReadBenchmark.ReadAllDecoded 77.77 ms 51.24 ms -34.1%
ExcelReader.Benchmarks.ParseBenchmark.ExcelParserAsync(Rows: 50000) 16.79 ms 11.03 ms -34.3%
ExcelReader.Benchmarks.ParseBenchmark.ExcelParserStructSync(Rows: 50000) 15.90 ms 10.37 ms -34.7%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "csv", ReadRows: False) 180 ns 116 ns -35.8%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.NarrowIntAggregate(Dop: 1) 726.34 ms 463.54 ms -36.2%
ExcelReader.Benchmarks.ParseBenchmark.RefStructModelSync(Rows: 50000) 14.52 ms 9.27 ms -36.2%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "xls", ReadRows: False) 1.53 ms 969.06 µs -36.7%
ExcelReader.Benchmarks.NativeTypedParseBenchmark.ParseTyped 42.95 ms 27.13 ms -36.8%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "xlsb", ReadRows: False) 64.92 µs 40.83 µs -37.1%
ExcelReader.Benchmarks.NativeRowReadBenchmark.NextRowDecoded 57.96 ms 36.28 ms -37.4%
ExcelReader.Benchmarks.WritePathBenchmark.NativeStrings_Xlsx 21.06 ms 13.17 ms -37.5%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "xls", ReadRows: False) 1.17 ms 728.92 µs -37.5%
ExcelReader.Benchmarks.WriteBenchmark.SpreadCheetah(Rows: 50000) 21.51 ms 13.17 ms -38.8%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "xlsb", ReadRows: True) 51.77 ms 31.59 ms -39.0%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "xlsx", ReadRows: True) 67.79 ms 41.30 ms -39.1%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "xlsb", ReadRows: True) 52.82 ms 32.15 ms -39.1%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "xlsb", ReadRows: True) 51.80 ms 31.42 ms -39.4%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "xlsx", ReadRows: True) 68.56 ms 41.45 ms -39.5%
ExcelReader.Benchmarks.CsvParseBenchmark.Sylvan(Rows: 50000) 20.32 ms 12.21 ms -39.9%
ExcelReader.Benchmarks.NativeTypedParseBenchmark.ParseArrow 45.08 ms 27.02 ms -40.1%
ExcelReader.Benchmarks.ChunkedParseBenchmark.WholeSheet(Rows: 50000) 12.45 ms 7.36 ms -40.9%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "xlsx", ReadRows: False) 864.85 µs 507.80 µs -41.3%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "xlsb", ReadRows: False) 463.35 µs 271.83 µs -41.3%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "csv", ReadRows: True) 16.59 ms 9.72 ms -41.4%
ExcelReader.Benchmarks.ChunkedParseBenchmark.Batched_1k(Rows: 50000) 11.76 ms 6.88 ms -41.5%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "xlsb", ReadRows: True) 52.88 ms 30.84 ms -41.7%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "xlsx", ReadRows: True) 68.95 ms 40.15 ms -41.8%
ExcelReader.Benchmarks.WritePathBenchmark.ArrowStrings_Xlsx 28.17 ms 16.33 ms -42.0%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "csv", ReadRows: True) 17.50 ms 10.13 ms -42.1%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "xlsx", ReadRows: True) 70.31 ms 40.42 ms -42.5%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "xlsb", ReadRows: False) 449.37 µs 255.17 µs -43.2%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "csv", ReadRows: True) 16.07 ms 9.05 ms -43.7%
ExcelReader.Benchmarks.WriteBenchmark.OfficeIMO(Rows: 50000) 24.90 ms 13.84 ms -44.4%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenSource(Format: "xls", ReadRows: True) 38.41 ms 21.30 ms -44.5%
ExcelReader.Benchmarks.ChunkedParseBenchmark.Batched_10k(Rows: 50000) 12.29 ms 6.77 ms -45.0%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "csv", ReadRows: True) 15.17 ms 8.32 ms -45.1%
ExcelReader.Benchmarks.WriteBenchmark.ExcelReaderWriterPrefetch(Rows: 50000) 10.36 ms 5.65 ms -45.5%
ExcelReader.Benchmarks.WritePathBenchmark.NativeStrings_Csv 7.24 ms 3.94 ms -45.6%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenStream(Format: "xls", ReadRows: True) 38.99 ms 21.11 ms -45.8%
ExcelReader.Benchmarks.CsvWriteBenchmark.ExcelReaderWriter(Rows: 50000) 6.56 ms 3.55 ms -45.9%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenMemory(Format: "xls", ReadRows: True) 37.79 ms 20.40 ms -46.0%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "xls", ReadRows: True) 37.08 ms 19.86 ms -46.4%
ExcelReader.Benchmarks.CsvWriteBenchmark.SylvanWriter(Rows: 50000) 10.60 ms 5.57 ms -47.5%
ExcelReader.Benchmarks.CsvParseBenchmark.Sep(Rows: 50000) 17.13 ms 8.91 ms -48.0%
ExcelReader.Benchmarks.NativeOpenBenchmark.OpenFile(Format: "xlsx", ReadRows: False) 57.42 µs 29.80 µs -48.1%
ExcelReader.Benchmarks.RecordWriteBenchmark.Xls(Rows: 50000) 7.49 ms 3.88 ms -48.2%
ExcelReader.Benchmarks.XlsWriteBenchmark.XlsxWriter(Rows: 50000) 13.14 ms 6.79 ms -48.3%
ExcelReader.Benchmarks.WriteBenchmark.ExcelReaderXlsbWriterSharedStrings(Rows: 50000) 8.89 ms 4.57 ms -48.6%
ExcelReader.Benchmarks.WriteBenchmark.ExcelReaderXlsbWriter(Rows: 50000) 8.81 ms 4.53 ms -48.6%
ExcelReader.Benchmarks.RecordWriteBenchmark.Xlsx(Rows: 50000) 13.66 ms 7.02 ms -48.6%
ExcelReader.Benchmarks.WriteBenchmark.ExcelReaderWriterSharedStrings(Rows: 50000) 13.43 ms 6.87 ms -48.8%
ExcelReader.Benchmarks.WriteBenchmark.ExcelReaderWriter(Rows: 50000) 13.63 ms 6.93 ms -49.1%
ExcelReader.Benchmarks.RecordWriteBenchmark.XlsxMapped(Rows: 50000) 14.86 ms 7.44 ms -49.9%
ExcelReader.Benchmarks.RecordWriteBenchmark.CsvMapped(Rows: 50000) 8.38 ms 4.17 ms -50.3%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavy(Dop: 8) 758.27 ms 375.25 ms -50.5%
ExcelReader.Benchmarks.CsvWriteBenchmark.Sep(Rows: 50000) 10.39 ms 5.13 ms -50.6%
ExcelReader.Benchmarks.RecordWriteBenchmark.Csv(Rows: 50000) 7.18 ms 3.52 ms -51.1%
ExcelReader.Benchmarks.RecordWriteBenchmark.Xlsb(Rows: 50000) 9.30 ms 4.54 ms -51.1%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavy(Dop: 4) 761.73 ms 371.36 ms -51.2%
ExcelReader.Benchmarks.WritePathBenchmark.StyledRows_Xlsx 8.53 ms 4.15 ms -51.4%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavy(Dop: 16) 779.50 ms 377.53 ms -51.6%
ExcelReader.Benchmarks.XlsWriteBenchmark.XlsWriter(Rows: 50000) 6.17 ms 2.98 ms -51.7%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.ExcelReader_Parallel(Corpus: ConversionHeavy) 531.75 ms 251.54 ms -52.7%
ExcelReader.Benchmarks.RecordWriteBenchmark.XlsbMapped(Rows: 50000) 10.09 ms 4.74 ms -53.0%
ExcelReader.Benchmarks.CsvParallelVsSepBenchmark.ExcelReader_Sequential(Corpus: ConversionHeavy) 947.23 ms 440.81 ms -53.5%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavy(Dop: 1) 1.49 s 682.32 ms -54.1%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavy(Dop: 2) 1.13 s 514.92 ms -54.3%
ExcelReader.Benchmarks.WriteBenchmark.ExcelReaderXlsbWriterPrefetch(Rows: 50000) 6.16 ms 2.80 ms -54.5%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavyAggregate(Dop: 2) 825.41 ms 369.46 ms -55.2%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavyAggregate(Dop: 8) 498.29 ms 213.82 ms -57.1%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavyAggregate(Dop: 16) 494.49 ms 208.27 ms -57.9%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavyAggregate(Dop: 4) 520.78 ms 211.33 ms -59.4%
ExcelReader.Benchmarks.CsvParallelParseBenchmark.ConversionHeavyAggregate(Dop: 1) 1.22 s 479.76 ms -60.8%

57 within ±10%, 44 with no baseline entry (new, renamed, or reparameterized).

Full results per group

ExcelReader.Benchmarks.ArrowConversionBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V74 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio Gen0 Gen1 Gen2 Allocated Alloc Ratio
CsvAllString 100000 31.32 ms 1.342 ms 0.208 ms 1.00 437.5000 312.5000 312.5000 16.27 MB 1.00
CsvTyped 100000 17.83 ms 0.715 ms 0.111 ms 0.57 437.5000 406.2500 406.2500 8.13 MB 0.50
XlsbTyped 100000 21.69 ms 1.065 ms 0.165 ms 0.69 343.7500 312.5000 312.5000 8.14 MB 0.50
CsvTypedWithInference 100000 15.73 ms 0.894 ms 0.232 ms 0.50 437.5000 375.0000 375.0000 14.89 MB 0.92

ExcelReader.Benchmarks.ChunkedParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Allocated Alloc Ratio
WholeSheet 50000 7.361 ms 1.2049 ms 0.3129 ms 1.00 0.06 9.97 KB 1.00
Batched_10k 50000 6.767 ms 0.3649 ms 0.0565 ms 0.92 0.04 16.92 KB 1.70
Batched_1k 50000 6.884 ms 0.4335 ms 0.1126 ms 0.94 0.04 81.25 KB 8.15

ExcelReader.Benchmarks.ColdStartBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-GOEFXF : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

InvocationCount=1  IterationCount=1  LaunchCount=16  
RunStrategy=ColdStart  UnrollFactor=1  WarmupCount=0  

Method Rows Mean Error StdDev Allocated
TypedParseFirstUse 200 60.93 ms 1.752 ms 1.720 ms 20.91 KB
RecordWriteFirstUse 200 24.14 ms 0.498 ms 0.489 ms 80.81 KB
FluentParseFirstUse 200 54.40 ms 0.688 ms 0.676 ms 23.42 KB
FluentParseWithAttributeFallbackFirstUse 200 63.89 ms 0.480 ms 0.472 ms 25.13 KB

ExcelReader.Benchmarks.CsvParallelParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
INTEL XEON PLATINUM 8573C 2.30GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Dop Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
ConversionHeavy 1 682.3 ms 20.86 ms 5.42 ms 1.00 0.01 8000.0000 - 671.44 MB 1.000
NarrowInt 1 636.3 ms 18.61 ms 4.83 ms 0.93 0.01 3000.0000 - 245.69 MB 0.366
ConversionHeavyAggregate 1 479.8 ms 10.18 ms 1.57 ms 0.70 0.01 - - 1.17 MB 0.002
NarrowIntAggregate 1 463.5 ms 20.93 ms 5.44 ms 0.68 0.01 - - 1.22 MB 0.002
ConversionHeavy 2 514.9 ms 22.19 ms 5.76 ms 1.00 0.01 8000.0000 4000.0000 678.84 MB 1.000
NarrowInt 2 476.6 ms 24.86 ms 6.46 ms 0.93 0.01 3000.0000 1000.0000 253.21 MB 0.373
ConversionHeavyAggregate 2 369.5 ms 28.17 ms 7.32 ms 0.72 0.01 - - 1.28 MB 0.002
NarrowIntAggregate 2 337.3 ms 51.60 ms 7.99 ms 0.66 0.02 - - 1.3 MB 0.002
ConversionHeavy 4 371.4 ms 58.00 ms 8.98 ms 1.00 0.03 8000.0000 5000.0000 678.94 MB 1.000
NarrowInt 4 338.3 ms 87.39 ms 13.52 ms 0.91 0.04 3000.0000 1000.0000 253.4 MB 0.373
ConversionHeavyAggregate 4 211.3 ms 17.28 ms 4.49 ms 0.57 0.02 - - 1.32 MB 0.002
NarrowIntAggregate 4 212.7 ms 6.01 ms 0.93 ms 0.57 0.01 - - 1.29 MB 0.002
ConversionHeavy 8 375.2 ms 61.01 ms 15.85 ms 1.00 0.05 8000.0000 6000.0000 679.09 MB 1.000
NarrowInt 8 341.6 ms 45.62 ms 11.85 ms 0.91 0.05 3000.0000 1000.0000 253.66 MB 0.374
ConversionHeavyAggregate 8 213.8 ms 5.31 ms 1.38 ms 0.57 0.02 - - 1.32 MB 0.002
NarrowIntAggregate 8 214.0 ms 8.10 ms 2.10 ms 0.57 0.02 - - 1.31 MB 0.002
ConversionHeavy 16 377.5 ms 144.09 ms 37.42 ms 1.01 0.13 8000.0000 3000.0000 679.34 MB 1.000
NarrowInt 16 326.0 ms 15.47 ms 2.39 ms 0.87 0.08 3000.0000 1000.0000 254.14 MB 0.374
ConversionHeavyAggregate 16 208.3 ms 7.07 ms 1.84 ms 0.56 0.05 - - 1.38 MB 0.002
NarrowIntAggregate 16 211.4 ms 1.37 ms 0.21 ms 0.56 0.05 - - 1.34 MB 0.002

ExcelReader.Benchmarks.CsvParallelVsSepBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
INTEL XEON PLATINUM 8573C 2.30GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Corpus Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
ExcelReader_Sequential NarrowInt 538.5 ms 9.19 ms 2.39 ms 1.00 0.01 3000.0000 - 244.14 MB 1.00
ExcelReader_Parallel NarrowInt 337.3 ms 37.36 ms 9.70 ms 0.63 0.02 3000.0000 1000.0000 253.31 MB 1.04
Sep_Sequential NarrowInt 463.3 ms 1.12 ms 0.29 ms 0.86 0.00 3000.0000 - 244.15 MB 1.00
Sep_Parallel NarrowInt 336.6 ms 71.93 ms 18.68 ms 0.62 0.03 3000.0000 1000.0000 260.49 MB 1.07
ExcelReader_Sequential ConversionHeavy 440.8 ms 9.59 ms 2.49 ms 1.00 0.01 5000.0000 - 467.3 MB 1.00
ExcelReader_Parallel ConversionHeavy 251.5 ms 27.03 ms 7.02 ms 0.57 0.01 5500.0000 5000.0000 473.76 MB 1.01
Sep_Sequential ConversionHeavy 784.8 ms 5.43 ms 1.41 ms 1.78 0.01 5000.0000 - 467.31 MB 1.00
Sep_Parallel ConversionHeavy 576.9 ms 54.90 ms 14.26 ms 1.31 0.03 6000.0000 5000.0000 477.74 MB 1.02

ExcelReader.Benchmarks.CsvParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
INTEL XEON PLATINUM 8573C 2.30GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio Gen0 Gen1 Allocated Alloc Ratio
ExcelParserSync 50000 4.723 ms 0.0070 ms 0.0011 ms 1.00 46.8750 - 3.86 MB 1.00
ExcelParserAsync 50000 4.997 ms 0.0198 ms 0.0031 ms 1.06 46.8750 - 3.86 MB 1.00
Sep 50000 8.907 ms 0.1459 ms 0.0379 ms 1.89 46.8750 - 3.87 MB 1.00
Sylvan 50000 12.214 ms 0.0826 ms 0.0214 ms 2.59 125.0000 15.6250 10.95 MB 2.84

ExcelReader.Benchmarks.CsvReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio Allocated Alloc Ratio
ExcelReader 50000 3.902 ms 0.0270 ms 0.0042 ms 1.00 888 B 1.00
ExcelReaderWide 50000 12.245 ms 0.1924 ms 0.0298 ms 3.14 888 B 1.00
ExcelReaderAsync 50000 4.007 ms 0.0083 ms 0.0021 ms 1.03 960 B 1.08
Sep 50000 13.521 ms 0.0085 ms 0.0013 ms 3.46 4024 B 4.53
Sylvan 50000 6.656 ms 0.0263 ms 0.0041 ms 1.71 38682 B 43.56

ExcelReader.Benchmarks.CsvWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 4.52GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
ExcelReaderWriter 50000 3.551 ms 0.0871 ms 0.0226 ms 1.00 0.01 500.0000 500.0000 500.0000 4 MB 1.00
Sep 50000 5.128 ms 0.4861 ms 0.1262 ms 1.44 0.03 500.0000 500.0000 500.0000 4.01 MB 1.00
SylvanWriter 50000 5.569 ms 0.1006 ms 0.0156 ms 1.57 0.01 500.0000 500.0000 500.0000 4.04 MB 1.01

ExcelReader.Benchmarks.DataReaderBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V74 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
Baseline_RawRows 50000 9.810 ms 0.0123 ms 0.0019 ms 1.00 0.00 - - 3.67 KB 1.00
DataReader_GetValue 50000 13.940 ms 0.0458 ms 0.0119 ms 1.42 0.00 312.5000 - 5131.32 KB 1,397.47
DataReader_TypedGetters 50000 12.610 ms 0.0978 ms 0.0151 ms 1.29 0.00 93.7500 - 1615.7 KB 440.02
DataReader_GetBytes 50000 10.550 ms 0.0059 ms 0.0015 ms 1.08 0.00 - - 4.37 KB 1.19
DataTable_Load 50000 78.577 ms 39.6218 ms 10.2897 ms 8.01 0.96 1000.0000 500.0000 23391.48 KB 6,370.45

ExcelReader.Benchmarks.EncryptedWorkbookBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V74 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
Plain_Stream 59.84 μs 14.94 μs 2.312 μs 1.00 0.05 0.4883 8.9 KB 1.00
Encrypted_Stream 58,392.51 μs 340.98 μs 88.552 μs 976.81 32.33 - 37.98 KB 4.27
Encrypted_Stream_VerifyIntegrity 58,273.90 μs 1,316.89 μs 203.791 μs 974.82 32.59 - 39.92 KB 4.49
Encrypted_Memory 65,249.63 μs 596.42 μs 92.297 μs 1,091.52 36.36 - 52.88 KB 5.94
Encrypted_OpenOnly 59,973.50 μs 2,322.08 μs 603.038 μs 1,003.26 34.44 - 32.3 KB 3.63
Large_Plain_Stream 57,227.69 μs 1,023.70 μs 265.851 μs 957.32 31.92 - 3.67 KB 0.41
Large_Encrypted_Stream 118,083.26 μs 1,894.43 μs 491.978 μs 1,975.33 65.75 - 29.44 KB 3.31
Large_Encrypted_OpenOnly 57,331.37 μs 615.84 μs 95.302 μs 959.06 31.95 - 28.78 KB 3.23

ExcelReader.Benchmarks.InflateBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Categories Mean Error StdDev Ratio RatioSD Allocated Alloc Ratio
SharedStrings_DeflateStream SharedStrings 15.217 ms 0.0396 ms 0.0061 ms 1.00 0.00 280 B 1.00
SharedStrings_InflateStream SharedStrings 8.279 ms 0.1174 ms 0.0305 ms 0.54 0.00 200 B 0.71
XlsbSheet_DeflateStream XlsbSheet 18.318 ms 1.6802 ms 0.4363 ms 1.00 0.03 280 B 1.00
XlsbSheet_InflateStream XlsbSheet 13.291 ms 0.0364 ms 0.0095 ms 0.73 0.02 200 B 0.71
XlsxSheet_DeflateStream XlsxSheet 31.992 ms 3.7064 ms 0.9625 ms 1.00 0.04 280 B 1.00
XlsxSheet_InflateStream XlsxSheet 20.141 ms 0.1520 ms 0.0235 ms 0.63 0.02 200 B 0.71

ExcelReader.Benchmarks.LargeSheetParallelBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Dop Mean Error StdDev Gen0 Gen1 Allocated
Xlsx_Aggregate 1 331.5 ms 6.97 ms 1.81 ms 3000.0000 - 79106.4 KB
Xlsb_Aggregate 1 223.4 ms 2.27 ms 0.35 ms 3000.0000 - 79106.26 KB
Xlsx_Parse 1 367.9 ms 14.52 ms 3.77 ms 3000.0000 - 79106.53 KB
Xlsb_Parse 1 250.7 ms 0.88 ms 0.23 ms 3000.0000 - 79106.39 KB
Csv_Aggregate 1 609.0 ms 6.69 ms 1.04 ms - - 2.84 KB
Csv_Parse 1 819.6 ms 21.27 ms 5.52 ms 26000.0000 - 638029.09 KB
Xlsx_Aggregate 2 273.0 ms 29.24 ms 4.52 ms 3000.0000 - 79486.25 KB
Xlsb_Aggregate 2 171.9 ms 11.20 ms 2.91 ms 3000.0000 - 79392.39 KB
Xlsx_Parse 2 305.8 ms 33.53 ms 8.71 ms 4000.0000 500.0000 109377.11 KB
Xlsb_Parse 2 192.9 ms 27.00 ms 4.18 ms 4000.0000 333.3333 102080.4 KB
Csv_Aggregate 2 320.7 ms 35.74 ms 9.28 ms - - 7.76 KB
Csv_Parse 2 751.3 ms 62.27 ms 9.64 ms 26000.0000 15000.0000 641772.1 KB
Xlsx_Aggregate 4 184.8 ms 12.30 ms 3.19 ms 3000.0000 - 79436.48 KB
Xlsb_Aggregate 4 136.6 ms 70.20 ms 18.23 ms 3000.0000 - 79584.72 KB
Xlsx_Parse 4 198.9 ms 17.32 ms 4.50 ms 4333.3333 1333.3333 109306.9 KB
Xlsb_Parse 4 151.3 ms 15.27 ms 3.96 ms 4250.0000 4000.0000 101986.75 KB
Csv_Aggregate 4 327.7 ms 12.43 ms 3.23 ms - - 11.62 KB
Csv_Parse 4 521.1 ms 34.14 ms 8.87 ms 26000.0000 21000.0000 641937.71 KB
Xlsx_Aggregate 8 192.4 ms 42.87 ms 11.13 ms 3000.0000 - 79355.48 KB
Xlsb_Aggregate 8 123.7 ms 36.32 ms 9.43 ms 3000.0000 - 79310.1 KB
Xlsx_Parse 8 215.2 ms 27.64 ms 4.28 ms 4000.0000 3000.0000 109258.59 KB
Xlsb_Parse 8 180.0 ms 76.35 ms 19.83 ms 4000.0000 3000.0000 102135.53 KB
Csv_Aggregate 8 330.4 ms 21.25 ms 5.52 ms - - 19.34 KB
Csv_Parse 8 516.8 ms 20.58 ms 3.18 ms 26000.0000 22000.0000 642057.84 KB
Xlsx_Aggregate 16 189.7 ms 10.84 ms 2.82 ms 3000.0000 - 79367.28 KB
Xlsb_Aggregate 16 123.3 ms 17.74 ms 4.61 ms 3000.0000 - 79356.3 KB
Xlsx_Parse 16 222.8 ms 11.91 ms 3.09 ms 4333.3333 4000.0000 109255.79 KB
Xlsb_Parse 16 167.3 ms 31.86 ms 4.93 ms 4000.0000 3000.0000 102025.29 KB
Csv_Aggregate 16 324.2 ms 10.85 ms 2.82 ms - - 35.13 KB
Csv_Parse 16 533.2 ms 74.74 ms 19.41 ms 26000.0000 1000.0000 642311.31 KB

ExcelReader.Benchmarks.NativeOpenBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Format ReadRows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
OpenMemory csv False 849,523.8 ns 165,849.12 ns 43,070.49 ns 1.002 0.07 398.4375 398.4375 398.4375 8171830 B 1.000
OpenFile csv False 7,053.2 ns 1,356.63 ns 352.31 ns 0.008 0.00 0.0610 - - 1072 B 0.000
OpenSource csv False 153.9 ns 5.69 ns 1.48 ns 0.000 0.00 0.0429 - - 720 B 0.000
OpenStream csv False 115.9 ns 13.14 ns 2.03 ns 0.000 0.00 0.0362 - - 608 B 0.000
OpenMemory csv True 9,054,646.2 ns 346,840.24 ns 90,073.31 ns 1.00 0.01 375.0000 375.0000 375.0000 8176367 B 1.000
OpenFile csv True 8,322,889.5 ns 256,057.38 ns 39,625.16 ns 0.92 0.01 - - - 5716 B 0.001
OpenSource csv True 9,716,907.3 ns 920,718.47 ns 142,482.20 ns 1.07 0.02 390.6250 390.6250 390.6250 8181276 B 1.001
OpenStream csv True 10,134,026.2 ns 430,783.99 ns 111,873.23 ns 1.12 0.02 500.0000 500.0000 500.0000 16717708 B 2.045
OpenMemory xls False 969,059.6 ns 180,552.61 ns 27,940.72 ns 1.00 0.04 332.0313 332.0313 332.0313 11834534 B 1.000
OpenFile xls False 169,187.2 ns 41,348.94 ns 10,738.19 ns 0.17 0.01 0.4883 - - 14528 B 0.001
OpenSource xls False 728,922.5 ns 71,104.76 ns 18,465.68 ns 0.75 0.03 399.4141 398.4375 398.4375 7646980 B 0.646
OpenStream xls False 1,641,041.8 ns 328,391.91 ns 85,282.34 ns 1.69 0.09 335.9375 335.9375 335.9375 27563484 B 2.329
OpenMemory xls True 20,402,481.1 ns 619,724.24 ns 95,903.01 ns 1.00 0.01 312.5000 312.5000 312.5000 11841246 B 1.000
OpenFile xls True 19,858,464.7 ns 474,224.06 ns 123,154.48 ns 0.97 0.01 - - - 21279 B 0.002
OpenSource xls True 21,300,650.2 ns 1,966,162.75 ns 510,606.22 ns 1.04 0.02 468.7500 468.7500 468.7500 11854640 B 1.001
OpenStream xls True 21,113,094.3 ns 185,196.17 ns 28,659.31 ns 1.03 0.00 375.0000 375.0000 375.0000 27570528 B 2.328
OpenMemory xlsb False 271,827.5 ns 46,881.15 ns 12,174.89 ns 1.00 0.06 333.4961 333.0078 333.0078 3882639 B 1.000
OpenFile xlsb False 40,830.8 ns 1,681.94 ns 260.28 ns 0.15 0.01 0.2441 - - 5264 B 0.001
OpenSource xlsb False 255,172.7 ns 31,071.50 ns 4,808.35 ns 0.94 0.04 333.4961 333.0078 333.0078 3881759 B 1.000
OpenStream xlsb False 1,253,232.1 ns 169,845.57 ns 44,108.36 ns 4.62 0.24 337.8906 337.8906 337.8906 11223278 B 2.891
OpenMemory xlsb True 31,588,067.4 ns 3,696,595.60 ns 959,994.14 ns 1.00 0.04 312.5000 312.5000 312.5000 3889278 B 1.000
OpenFile xlsb True 31,415,365.6 ns 2,864,528.27 ns 743,908.90 ns 1.00 0.03 - - - 11959 B 0.003
OpenSource xlsb True 30,844,607.9 ns 1,422,083.10 ns 220,068.93 ns 0.98 0.03 312.5000 312.5000 312.5000 3890326 B 1.000
OpenStream xlsb True 32,146,524.8 ns 1,190,432.41 ns 184,220.73 ns 1.02 0.03 500.0000 500.0000 500.0000 11230452 B 2.888
OpenMemory xlsx False 507,803.1 ns 39,732.41 ns 6,148.63 ns 1.00 0.02 333.0078 333.0078 333.0078 6725471 B 1.000
OpenFile xlsx False 29,797.5 ns 630.14 ns 163.65 ns 0.06 0.00 0.2441 - - 4096 B 0.001
OpenSource xlsx False 962,199.8 ns 493,179.91 ns 128,077.26 ns 1.90 0.23 349.6094 349.6094 349.6094 6726624 B 1.000
OpenStream xlsx False 1,368,421.8 ns 237,212.54 ns 61,603.34 ns 2.70 0.11 398.4375 398.4375 398.4375 14065898 B 2.091
OpenMemory xlsx True 41,296,086.9 ns 5,010,498.73 ns 1,301,210.61 ns 1.00 0.04 307.6923 307.6923 307.6923 6733629 B 1.000
OpenFile xlsx True 40,153,859.7 ns 1,669,779.17 ns 258,400.18 ns 0.97 0.03 - - - 12425 B 0.002
OpenSource xlsx True 41,446,660.1 ns 2,778,634.81 ns 721,602.64 ns 1.00 0.03 153.8462 153.8462 153.8462 6738002 B 1.001
OpenStream xlsx True 40,421,505.6 ns 1,137,787.43 ns 295,479.78 ns 0.98 0.03 461.5385 461.5385 461.5385 14074231 B 2.090

ExcelReader.Benchmarks.NativeRowReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
NextRowBlob 32.89 ms 1.293 ms 0.200 ms 1.00 0.01 312.5000 312.5000 312.5000 3.71 MB 1.00
NextRowDecoded 36.28 ms 1.376 ms 0.357 ms 1.10 0.01 307.6923 307.6923 307.6923 3.71 MB 1.00
ReadAllBlob 36.34 ms 8.179 ms 2.124 ms 1.11 0.06 1133.3333 1066.6667 66.6667 21.06 MB 5.68
ReadAllDecoded 51.24 ms 1.270 ms 0.330 ms 1.56 0.01 600.0000 600.0000 600.0000 5.71 MB 1.54

ExcelReader.Benchmarks.NativeTypedParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 2.60GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Ratio Gen0 Gen1 Gen2 Allocated Alloc Ratio
ParseTyped 27.13 ms 0.845 ms 0.131 ms 1.00 312.5000 312.5000 312.5000 3.71 MB 1.00
ParseArrow 27.02 ms 0.913 ms 0.237 ms 1.00 312.5000 312.5000 312.5000 3.72 MB 1.00

ExcelReader.Benchmarks.ParallelRecordWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 4.52GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Categories Mean Error StdDev Ratio RatioSD Allocated Alloc Ratio
Xlsb_Serial Xlsb 88.73 ms 5.235 ms 1.360 ms 1.00 0.02 13.47 KB 1.00
Xlsb_Serial_Prefetch Xlsb 50.34 ms 4.384 ms 0.678 ms 0.57 0.01 44.85 KB 3.33
Xlsb_Parallel_1 Xlsb 89.88 ms 4.500 ms 1.169 ms 1.01 0.02 45.53 KB 3.38
Xlsb_Parallel_2 Xlsb 58.91 ms 16.411 ms 4.262 ms 0.66 0.04 76.96 KB 5.71
Xlsb_Parallel_4 Xlsb 40.71 ms 6.470 ms 1.680 ms 0.46 0.02 78.95 KB 5.86
Xlsb_Parallel_8 Xlsb 45.77 ms 9.388 ms 2.438 ms 0.52 0.03 411.63 KB 30.56
Xlsb_Parallel_16 Xlsb 39.60 ms 5.713 ms 0.884 ms 0.45 0.01 66.29 KB 4.92
Xlsx_Serial Xlsx 138.78 ms 2.112 ms 0.327 ms 1.00 0.00 16.21 KB 1.00
Xlsx_Serial_Prefetch Xlsx 91.88 ms 34.729 ms 9.019 ms 0.66 0.06 18.38 KB 1.13
Xlsx_Parallel_1 Xlsx 134.06 ms 3.469 ms 0.901 ms 0.97 0.01 48.21 KB 2.97
Xlsx_Parallel_2 Xlsx 73.83 ms 11.245 ms 2.920 ms 0.53 0.02 78.51 KB 4.84
Xlsx_Parallel_4 Xlsx 57.26 ms 9.922 ms 2.577 ms 0.41 0.02 82.23 KB 5.07
Xlsx_Parallel_8 Xlsx 59.50 ms 6.644 ms 1.725 ms 0.43 0.01 71.91 KB 4.44
Xlsx_Parallel_16 Xlsx 57.07 ms 4.722 ms 0.731 ms 0.41 0.00 91.61 KB 5.65

ExcelReader.Benchmarks.ParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
INTEL XEON PLATINUM 8573C 2.30GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
ExcelParserSync 50000 11.025 ms 0.0503 ms 0.0131 ms 1.00 0.00 46.8750 3959.25 KB 1.000
ExcelParserSyncSharedStrings 50000 9.817 ms 0.0528 ms 0.0137 ms 0.89 0.00 15.6250 2349.14 KB 0.593
ExcelParserStructSync 50000 10.375 ms 0.0330 ms 0.0086 ms 0.94 0.00 15.6250 1615.5 KB 0.408
RefStructModelSync 50000 9.265 ms 0.1669 ms 0.0258 ms 0.84 0.00 - 4.17 KB 0.001
ExcelParserAsync 50000 11.035 ms 0.0160 ms 0.0025 ms 1.00 0.00 46.8750 3959.36 KB 1.000
ExcelParserXlsbSync 50000 7.327 ms 0.0251 ms 0.0039 ms 0.66 0.00 46.8750 3959.52 KB 1.000
ExcelParserXlsbAsync 50000 7.461 ms 0.0109 ms 0.0017 ms 0.68 0.00 46.8750 3959.63 KB 1.000
OfficeIMO 50000 13.034 ms 0.0703 ms 0.0109 ms 1.18 0.00 15.6250 2421.61 KB 0.612
Sylvan 50000 63.230 ms 1.3869 ms 0.3602 ms 5.74 0.03 125.0000 10726.68 KB 2.709
SylvanAsync 50000 73.218 ms 115.9286 ms 17.9401 ms 6.64 1.45 - 10728.01 KB 2.710

ExcelReader.Benchmarks.ReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
ExcelReader 50000 11.276 ms 0.0221 ms 0.0057 ms 1.00 0.00 - 3.63 KB 1.00
ExcelReaderAsync 50000 11.873 ms 0.0698 ms 0.0181 ms 1.05 0.00 - 3.7 KB 1.02
ExcelReaderXlsb 50000 6.474 ms 0.0641 ms 0.0166 ms 0.57 0.00 - 3.89 KB 1.07
ExcelReaderXlsbAsync 50000 6.888 ms 0.0878 ms 0.0136 ms 0.61 0.00 - 3.96 KB 1.09
ExcelReaderMaterialized 50000 12.787 ms 0.1423 ms 0.0369 ms 1.13 0.00 93.7500 1614.95 KB 445.50
Sylvan 50000 56.316 ms 1.1713 ms 0.3042 ms 4.99 0.02 - 1939.64 KB 535.07
OfficeIMO 50000 19.781 ms 0.8865 ms 0.2302 ms 1.75 0.02 218.7500 3592.13 KB 990.93
OfficeIMOXlsb 50000 16.786 ms 0.1261 ms 0.0328 ms 1.49 0.00 312.5000 5247.25 KB 1,447.52

ExcelReader.Benchmarks.RealDataReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
Xlsx_ExcelReader 63.384 ms 0.1607 ms 0.0417 ms 1.00 0.00 - 7560 B 1.00
Xlsx_Sylvan 312.905 ms 4.0636 ms 1.0553 ms 4.94 0.02 - 659616 B 87.25
Xlsx_ExcelReader_Materialized 65.781 ms 1.2067 ms 0.3134 ms 1.04 0.00 - 17256 B 2.28
Xlsx_ExcelReader_Prefetch 46.832 ms 12.9521 ms 3.3636 ms 0.74 0.05 - 24155 B 3.20
Xlsx_ExcelReader_Memory 62.444 ms 0.2961 ms 0.0769 ms 0.99 0.00 - 7272 B 0.96
Xlsx_ExcelReader_Memory_Prefetch 46.701 ms 7.0668 ms 1.0936 ms 0.74 0.02 - 23846 B 3.15
Xlsm_ExcelReader 63.190 ms 1.6789 ms 0.4360 ms 1.00 0.01 - 7560 B 1.00
Xlsm_Sylvan 299.298 ms 3.4752 ms 0.5378 ms 4.72 0.01 - 659696 B 87.26
Xlsm_ExcelReader_Materialized 65.665 ms 0.4803 ms 0.1247 ms 1.04 0.00 - 17256 B 2.28
Xlsm_ExcelReader_Prefetch 47.926 ms 10.3984 ms 2.7004 ms 0.76 0.04 - 24048 B 3.18
Xlsm_ExcelReader_Memory 62.833 ms 1.4923 ms 0.2309 ms 0.99 0.00 - 7272 B 0.96
Xlsm_ExcelReader_Memory_Prefetch 50.012 ms 11.5013 ms 2.9869 ms 0.79 0.04 - 23906 B 3.16
Xlsb_ExcelReader 31.374 ms 0.1169 ms 0.0303 ms 0.49 0.00 - 7104 B 0.94
Xlsb_Sylvan 42.225 ms 0.1939 ms 0.0300 ms 0.67 0.00 - 346689 B 45.86
Xlsb_ExcelReader_Materialized 32.137 ms 0.1164 ms 0.0302 ms 0.51 0.00 - 16800 B 2.22
Xlsb_ExcelReader_Prefetch 19.586 ms 9.1835 ms 2.3849 ms 0.31 0.03 - 11478 B 1.52
Xlsb_ExcelReader_Memory 29.719 ms 0.0905 ms 0.0235 ms 0.47 0.00 - 8816 B 1.17
Xlsb_ExcelReader_Memory_Prefetch 17.818 ms 2.8068 ms 0.7289 ms 0.28 0.01 - 12910 B 1.71
Xls_ExcelReader 15.718 ms 0.3337 ms 0.0516 ms 0.25 0.00 - 12304 B 1.63
Xls_Sylvan 25.325 ms 0.0688 ms 0.0179 ms 0.40 0.00 - 190366 B 25.18
Xls_ExcelReader_Materialized 18.109 ms 0.0810 ms 0.0125 ms 0.29 0.00 - 22000 B 2.91
Xls_ExcelReader_Memory 15.596 ms 0.0542 ms 0.0141 ms 0.25 0.00 - 12168 B 1.61
Csv_ExcelReader 8.095 ms 0.1148 ms 0.0298 ms 0.13 0.00 - 888 B 0.12
Csv_Sylvan 6.597 ms 0.0862 ms 0.0224 ms 0.10 0.00 - 41226 B 5.45
Csv_ExcelReader_Materialized 32.215 ms 0.6513 ms 0.1692 ms 0.51 0.00 1437.5000 37443496 B 4,952.84
Csv_ExcelReader_Memory 7.437 ms 0.0961 ms 0.0149 ms 0.12 0.00 - 616 B 0.08

ExcelReader.Benchmarks.RealDataTypedParseBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Ratio Gen0 Allocated Alloc Ratio
Xlsx_ExcelParser 76.49 ms 0.608 ms 0.094 ms 1.00 285.7143 8.02 MB 1.00
Xlsb_ExcelParser 41.87 ms 0.277 ms 0.043 ms 0.55 333.3333 8.02 MB 1.00

ExcelReader.Benchmarks.RecordWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 4.52GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
Xlsx 50000 7.022 ms 0.3802 ms 0.0987 ms 1.00 0.02 390.6250 390.6250 390.6250 4.02 MB 1.00
Xlsb 50000 4.545 ms 0.4541 ms 0.1179 ms 0.65 0.02 390.6250 390.6250 390.6250 4.02 MB 1.00
Xls 50000 3.878 ms 0.3355 ms 0.0519 ms 0.55 0.01 210.9375 203.1250 203.1250 4.31 MB 1.07
Csv 50000 3.515 ms 0.2517 ms 0.0389 ms 0.50 0.01 500.0000 500.0000 500.0000 4 MB 1.00
XlsxMapped 50000 7.440 ms 0.4097 ms 0.1064 ms 1.06 0.02 390.6250 390.6250 390.6250 4.02 MB 1.00
XlsbMapped 50000 4.739 ms 0.2169 ms 0.0336 ms 0.67 0.01 390.6250 390.6250 390.6250 4.02 MB 1.00
CsvMapped 50000 4.168 ms 0.3703 ms 0.0962 ms 0.59 0.01 500.0000 500.0000 500.0000 4 MB 1.00

ExcelReader.Benchmarks.SheetParallelBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Dop Mean Error StdDev Gen0 Allocated
Xlsx_Aggregate 1 74.96 ms 1.715 ms 0.265 ms 285.7143 8.02 MB
Xlsb_Aggregate 1 42.32 ms 0.240 ms 0.062 ms 333.3333 8.02 MB
Xlsx_Aggregate 2 63.45 ms 8.441 ms 2.192 ms 250.0000 8.13 MB
Xlsb_Aggregate 2 31.49 ms 4.493 ms 0.695 ms 312.5000 8.07 MB
Xlsx_Aggregate 4 41.74 ms 0.765 ms 0.118 ms 333.3333 8.1 MB
Xlsb_Aggregate 4 27.80 ms 0.814 ms 0.211 ms 312.5000 8.07 MB
Xlsx_Aggregate 8 42.21 ms 2.145 ms 0.557 ms 333.3333 8.14 MB
Xlsb_Aggregate 8 27.81 ms 0.171 ms 0.044 ms 312.5000 8.09 MB

ExcelReader.Benchmarks.StringHeavyReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 3.98GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
Xlsx_ExcelReader 65536 30.77 ms 3.191 ms 0.494 ms 1.00 0.02 - - - 2.18 MB 1.00
Xlsx_ExcelReader_Prefetch 65536 22.70 ms 3.227 ms 0.499 ms 0.74 0.02 - - - 2.22 MB 1.02
Xlsx_Sylvan 65536 146.78 ms 7.057 ms 1.833 ms 4.77 0.09 1000.0000 750.0000 250.0000 17.41 MB 7.99
Xlsx_ExcelReader_Materialized 65536 47.19 ms 4.221 ms 1.096 ms 1.53 0.04 1181.8182 1090.9091 363.6364 15.25 MB 7.00
Xlsx_ExcelReader_Materialized_Interned 65536 48.49 ms 2.684 ms 0.697 ms 1.58 0.03 1181.8182 1090.9091 363.6364 15.26 MB 7.00
Xlsb_ExcelReader 65536 25.63 ms 1.748 ms 0.454 ms 0.83 0.02 - - - 2.18 MB 1.00
Xlsb_ExcelReader_Prefetch 65536 15.50 ms 2.124 ms 0.329 ms 0.50 0.01 - - - 2.2 MB 1.01
Xlsb_Sylvan 65536 52.37 ms 4.611 ms 0.714 ms 1.70 0.03 1111.1111 1000.0000 333.3333 17.38 MB 7.97
Xlsb_ExcelReader_Materialized 65536 42.86 ms 1.304 ms 0.339 ms 1.39 0.02 1083.3333 1000.0000 333.3333 15.25 MB 7.00
Xlsb_ExcelReader_Materialized_Interned 65536 42.69 ms 5.798 ms 0.897 ms 1.39 0.03 1083.3333 1000.0000 333.3333 15.26 MB 7.00
Xlsb_ExcelReader_Memory 65536 26.66 ms 0.681 ms 0.177 ms 0.87 0.01 - - - 6.47 MB 2.97

ExcelReader.Benchmarks.WriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 4.52GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
ExcelReaderWriter 50000 6.933 ms 0.3579 ms 0.0554 ms 1.00 0.01 390.6250 390.6250 390.6250 4.02 MB 1.00
ExcelReaderWriterSharedStrings 50000 6.870 ms 0.4213 ms 0.1094 ms 0.99 0.02 390.6250 390.6250 390.6250 4.06 MB 1.01
ExcelReaderWriterPrefetch 50000 5.649 ms 1.4070 ms 0.3654 ms 0.81 0.05 226.5625 226.5625 226.5625 4.02 MB 1.00
ExcelReaderXlsbWriter 50000 4.527 ms 0.3308 ms 0.0859 ms 0.65 0.01 390.6250 390.6250 390.6250 4.02 MB 1.00
ExcelReaderXlsbWriterSharedStrings 50000 4.570 ms 0.4620 ms 0.1200 ms 0.66 0.02 390.6250 390.6250 390.6250 4.05 MB 1.01
ExcelReaderXlsbWriterPrefetch 50000 2.802 ms 0.3952 ms 0.0612 ms 0.40 0.01 238.2813 238.2813 238.2813 4.02 MB 1.00
OfficeIMO 50000 13.840 ms 1.5160 ms 0.2346 ms 2.00 0.03 328.1250 328.1250 328.1250 4.04 MB 1.01
SpreadCheetah 50000 13.165 ms 1.4098 ms 0.3661 ms 1.90 0.05 1390.6250 656.2500 656.2500 15.84 MB 3.94

ExcelReader.Benchmarks.WritePathBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 4.52GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Mean Error StdDev Allocated
NativeStrings_Xlsx 13.174 ms 0.6131 ms 0.1592 ms 16308 B
NativeStrings_Csv 3.937 ms 0.4465 ms 0.0691 ms 416 B
ArrowStrings_Xlsx 16.332 ms 1.3122 ms 0.2031 ms 16360 B
StyledRows_Xlsx 4.147 ms 0.0785 ms 0.0204 ms 16490 B

ExcelReader.Benchmarks.XlsReadBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 7763 2.45GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v3

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Allocated Alloc Ratio
ExcelReader 50000 5.356 ms 0.2001 ms 0.0520 ms 1.00 0.01 - - 2.84 KB 1.00
ExcelReaderAsync 50000 4.892 ms 0.0553 ms 0.0144 ms 0.91 0.01 - - 2.91 KB 1.02
Sylvan 50000 8.802 ms 0.0859 ms 0.0133 ms 1.64 0.01 93.7500 15.6250 1717.73 KB 605.70
OfficeIMO 50000 11.044 ms 0.1788 ms 0.0464 ms 2.06 0.02 640.6250 - 10499.26 KB 3,702.22

ExcelReader.Benchmarks.XlsWriteBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 4.52GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Gen0 Gen1 Gen2 Allocated Alloc Ratio
XlsWriter 50000 2.978 ms 0.2340 ms 0.0608 ms 1.00 0.03 335.9375 324.2188 324.2188 16.31 MB 1.00
XlsxWriter 50000 6.792 ms 0.3364 ms 0.0874 ms 2.28 0.05 390.6250 390.6250 390.6250 4.02 MB 0.25

ExcelReader.Benchmarks.XlsxSharedStringHotPathBenchmark


BenchmarkDotNet v0.15.8, Linux Ubuntu 24.04.5 LTS (Noble Numbat)
AMD EPYC 9V45 3.98GHz, 1 CPU, 4 logical and 2 physical cores
.NET SDK 10.0.402
  [Host]     : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4
  Job-MEHJPP : .NET 10.0.13 (10.0.13, 10.0.1326.50504), X64 RyuJIT x86-64-v4

IterationCount=5  WarmupCount=1  

Method Rows Mean Error StdDev Ratio RatioSD Allocated Alloc Ratio
EndToEnd 65536 31.768 ms 0.3777 ms 0.0981 ms 1.00 0.00 2285808 B 1.00
EndToEnd_Prefetch 65536 23.031 ms 2.4613 ms 0.6392 ms 0.72 0.02 2322609 B 1.02
SharedStringPrologue 65536 10.832 ms 0.3168 ms 0.0823 ms 0.34 0.00 764944 B 0.33
Stored_EndToEnd 65536 17.962 ms 0.7165 ms 0.1861 ms 0.57 0.01 2285128 B 1.00
Stored_SharedStringPrologue 65536 3.817 ms 0.5543 ms 0.0858 ms 0.12 0.00 764264 B 0.33
IndexParse_Utf8Parser 65536 2.113 ms 0.0596 ms 0.0155 ms 0.07 0.00 - 0.00
IndexParse_DigitLoop 65536 1.274 ms 0.0686 ms 0.0106 ms 0.04 0.00 - 0.00

@GabrielMarquezMatte
GabrielMarquezMatte merged commit d09b2f6 into master Oct 16, 2026
49 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-benchmarks Run the benchmark suite on this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants