orizuru

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

【C#】【Linq】データ検索速度比較

約 4 分
【C#】【Linq】データ検索速度比較

お久しぶりです、エンジニアのMasashiです。

今回はC#を扱う上で非常によく話題になりますDataTableからのデータ検索速度について検証を行ってみました。
DataTableから該当のデータを取得する方法は様々あり、
ソースコードが書かれた年代などで書き方も様々だと思います。
そこで、DataTableからデータを検索・取得する速度について検証を行ってみたいと思います。

今回の記事は下記記事の結果を元に検証方法を決定しています。
【C#】DataTableのデータアクセス速度比較

測定までの流れ

今回測定を行うのは、DataTableに格納されているデータから該当のデータを取得する際にかかった時間になります。
DataTableには、ID・Name・RandomNoが保持されており、RandomNoが8,000以上のデータを検索します。
データの取得方法については、DataTable.Select・Linqと以前の検証記事から速度の速かったDataColumnにIndexを使用する方法、
可読性を考慮して比較的使用されていると考えられるDataColumnでのアクセスになります。

測定環境

  • Visual Studio 2015

対象データ

  • 列数:3(ID,Name,RandomNo)
  • 行数:1,000,000
  • 乱数範囲:0~10,000
  • 検索値:RandomNoが8,000以上のデータ

測定対象

  • DataTable.Selectで取得
  • Linqで取得
  • DataColumnにIndexを使用して取得
  • DataColumnでアクセスして取得

テストコード

測定結果

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

ここをタップして表示Close
計測項目 計測時間(ms)
DataTable.Selectで取得 2411.8
Linqで取得 332.6
DataColumnにIndexを使用して取得 292.6
DataColumnでアクセスして取得 319.2

上記からDataTableで該当のデータ取得にはDataColumnにIndexを使用して取得が一番速い結果になりました。
前回の記事通りの結果といえるのではないでしょうか。
DataColumにIndexを使用するパターンとDataColumnでアクセスする方法では、
以前の記事同様にIndexを使用した手法のほうが速い結果になりました。
遅いと評判をよく耳にしていたDataTable.Selectですが、比較すると非常に遅い結果になっています。
これは、ReferenceSourceを見てみるとDataRow単位でデータを取り出し比較、条件に合致する場合は別の変数に確保しておき、
最終的に返却する変数に値を移し替えるなどの処理があり結果的に時間がかかっているようです。
Linqは即時実行させてみた結果、遅くもないけど速くもない結果になりました。

まとめ

今回はDataColumnにIndexを使用して取得する方法が一番データの検索・取得は速く行えました。
Linqが使われていない際によくみられるDataTableへのIndex・Columnを使ったアクセスは、
速度に大きな差があるわけではないので可読性を考慮してColumnでのアクセスでも問題ないかと考えられます。
今回はDataTable.Selectとそれ以外の手法で速度結果の差が大きく驚きました。
引き続きいろいろな速度調査を行っていきたいと思います。

About The Author

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

Leave A Reply

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