C# Dictionary のループのパフォーマンス

posted in: C# | 0

商品コードと値段 のレコードに対し、値段の合計を求めるコードを考えてみたいと思います。

Dictionary 対 List

Dictionary がハッシュテーブルなのに対し、List は順序配列なので、
今回の処理では当然 Listの方が速いと思われます。

実行結果:

予想通りです。

より速く

Dictionary のループの仕方を変えてやることで、速度改善が図れることがあります。

実行結果:

Dictionary.Keys ではなく、Dictionary のアイテムそのものを回してやることで、
3割近く改善することができました。

さらに、Valuesそのものを回してやると、

実行結果:

誤差の範囲かも知れませんが、List より速くなりました。

他の方法

せっかくなので、他の方法も試してみます。

実行結果:

Dictionary.Keys のループとあまり変わりませんが、意味はわかりやすいし、
シンプルだし、速度を求めないのであれば個人的には好みです。

無理やりですが配列っぽくアクセスする方法も試してみます。

ただし、この方法は非常に遅いです。
私のPCではテストデータを 1/1000 の個数に変更してようやく、327ms でした。

まとめ(私見)

  • Keyを使ったアクセスが重要でないなら List を使うべき。
  • Dictionary をループさせるなら、Keys ではなく Dictionaryのアイテムで回す。
  • 速度重視でないなら、Linq がわかりやすい。
  • ElementAt() はループの中では使わない。
LINEで送る
Pocket