orizuru

つながる.見える.わかる IoTソリュ-ション

【C#】DataTableのデータアクセス速度比較

約 3 分
【C#】DataTableのデータアクセス速度比較

はじめまして、エンジニアのMasashiです。普段はC#で業務系アプリの製造を行っています。

C#を扱っているとポピュラーなDataTableですが、調べてみると処理速度が遅いという記事がよく見られます。
今回自分は、以前から記事を見て気になっていましたDataTableのデータアクセス速度について、いくつかパターンを設けて調査を行ってみました。

測定までの流れ

今回測定を行うのは、DataTableまたは、Listに格納されているデータに全件アクセスする際の速度になっています。
DataTableについては、データへのアクセス方法にいくつか手段を持たせ、各々の速度を測定してみます。
Listのデータアクセス速度を測定する理由は、DataTableと同件数のデータへアクセスする際の速度比較用になります。

測定環境

  • Visual Studio 2017

対象データ数

  • 列数:100
  • 行数:100000

測定対象

  • DataTableに列名でアクセス
  • DataTableにDataColumnでアクセス
  • DataTableのDataColumnにIndexを使用してアクセス
  • DataTableのRow・ColumnともにIndexを使用してアクセス
  • Listにアクセス

テストコード

測定結果

10回試行した結果の平均値が下記になっています。小数点以下は四捨五入しています。

ここをタップして表示Close
計測項目 計測時間(ms)
列名でアクセス 1332
DataColumnでアクセス 1067
DataColumnのみIndexを使用 923
Row/ColumnともにIndexを使用 1026
Listにアクセス 784

上記からDataTableでのデータ取得速度を比較するとDataColumnにIndexを適用したパターンが一番速い結果になりました。DataTableを使用する際に一番使用している列名でのアクセスは考えていた通り一番遅く、Listと比較すると約1.7倍の速度差があることがわかります。
DataColumnにIndexを使用したデータとRow/Column共にIndexを使用しているデータで速度差があるのは、Rowデータを使いまわすために行単位で一度変数に格納している処理が加わっているためではないかと考えられます。

まとめ

DataTableのデータにアクセスする際は、DataColumnを使用するかIndexを使用してアクセスすることにより、列名でアクセスするよりも速度が向上しました。しかし、可読性等を考えるとやはり、列名でアクセスする方法に軍配が上がるかと思います。
アクセス速度の向上が求められる場合は、DataColumnやIndexでアクセスまたは、Listに変換してアクセスする方法を検討してみてはいかがでしょうか。
機会がありましたらDataTableのデータ抽出処理の速度比較も調査してみようと思います。

About The Author

エンジニアMasashi
C#を用いた業務系アプリの製造に従事。

Leave A Reply

*
*
* (公開されません)