C#でのエクセル読出し速度を比較してみた(1)

どもです。

今回は、C#でのエクセルデータ読出し速度を比較してみた内容について書きます。

0. はじめに

まず初めに、C#でエクセルのデータを読み出すために使用するライブラリ/パッケージとしては、ClosedXMLExcelDataReaderが有名です。この2つのライブラリの性能を比較した結果も、ネットに溢れています。そして、(調べられた限りでは)その全てにおいて、“ExcelDataReader"の方が速いと結論づけられています。

ところで、この読出し速度(性能)を比較する際に使用しているデータは、1つのシートに1つのテーブル、かつシートの先頭からテーブルが開始している、という内容でした。この比較の仕方を見て思いました。

1つのシートに複数のテーブルがあり、その中から任意のテーブルの値を読み出す場合には、どちらが速いのだろう?

そこで今回は、この疑問について調べたので、その方法と結果について書きます。

1. 比較環境

今回のエントリでは、以下の環境で作業を行います。

性能比較実行環境
項目 内容
OS Windows10 Pro(22H2)
CPU i7-8700
メモリ 16GB
IDE Visual Studio Commnuity 2019
version 16.11.19
ClosedXML ver.0.97.0.0
ExcelDataReader ver.3.6.0.0
ExcelDataReader.DataSet ver.3.6.0.0

2. 比較手順

比較は、以下の手順で行います。

  1. 任意のシートから、任意の文字列(テーブル名)がセットされたセルを見つける。(見つけたセルの1行下、1列右のセルを、テーブルの先頭のセルとする。)
  2. テーブルの先頭列から右方向に、空白のセルが見つかるまで読み込む。
    (読み込んだ値は、テーブルヘッダとする。)
  3. テーブルの先頭の次の行、先頭列から右方向に1行分読み出す。
  4. 各行の先頭列が空白になるまで、1行ずつ読み出す。

ここで、テストを容易にするために、これらの手順を実施するラッパとなるクラスを、各ライブラリ毎に作成します。

2.1. 比較に使用するライブラリ

…使用するライブラリの実装をココで紹介しようと思ったのですが、意外と長くなってしまいました。なので、本記事での紹介は省略します。詳細は、GitHub – CsMySamples/TableReaderに公開していますので、そちらを参考してください。

2.2. 比較で使用するデータ

比較では、以下のようなデータを用意します。

No. データの内容
1
  • TestTable_001
  • テーブル名はB1セルに記載
  • 100×100
2
  • TestTable_002
  • テーブル名はB106セルに記載
  • 100×100
3
  • TestTable_003
  • テーブル名はCS2セルに記載
  • 10×10
4
  • TestTable_004
  • テーブル名はCZ107セルに記載
  • 26×50
  • 一部空白セルあり

2.3. 比較方法

今回は、上述の各テーブルをそれぞれ100回読み込み、読み込みに要した時間の平均値を測定、比較します。

3. 結果

比較した結果は、以下の通りです。

No ClosedXML ExcelDataReader
1 340 ms 61 ms
2 339 ms 65 ms
3 327 ms 58 ms
4 338 ms 60 ms

4. まとめ

今回は、ClosedXMLとExcelDataReaderの性能比較を行ってみました。ただ、既にネット上に溢れているような「一般的な」使い方での性能比較ではなく、「逸般的な」使い方での性能比較でした。

結果は、ExcelDataReaderの方が速いです。結果のテーブルで示した通り、ExcelDataReaderの方が、ClosedXMLよりも5~6倍という結果でした。

やっぱり、C#でのExcelの読出しは、ExcelDataReaderが速い!

ではっ!