C#における高速化手段をいろいろ検討した。
メモとして書き残しておく。
ジェネリッククラスのコレクション
.NET2.0で追加されたジェネリッククラスは従来のコレクションクラスより速い。
なぜならばインスタンスを作成した時点で扱える型が決まっているためボクシングの作業が必要ない。
ゆえに値型を扱う場合は大幅なパフォーマンス向上が得られる。
- abstract class Comparer
- abstract class EqualityComparer
- class Dictionary
- class LinkedList
- class List
- class Queue
- class SortedDictionary
- class SortedList
- class Stack
- struct KeyValuePair
- interface ICollection
- interface IComparer
- interface IDictionary
- interface IEnumerable
- interface IEnumerator
- interface IEqualityComparer
- interface IList
ArrayとHashtable
データの羅列から任意のデータを選択する場合に高速に扱うにはどうするか。
C#ではArray, ArrayList, Hashtable
などが挙げられる。
インデックス指定だけで片付けられる問題ならばArray
かArrayList
を使うのが最適であると判断できるが、キーと値の2種のオブジェクトを関連付けたい時はやはりHashtable
が便利だ。高速であるとも言われている。
そこで、キーと値の2種をメンバとしたクラスのArray
とHashtable
の速度比較をした。
今回はキーにIPAddress
クラス、値にはstring
を用いてArray
のキー検索は線形探索。
[16個のアイテムから全アイテムを検索するを1万回ループ]
Array: 94ms, Hashtable: 172ms
アイテムが16個しか無い場合はArrayが勝るが…
[256個のアイテムから全アイテムを検索するを1万回ループ]
Array: 10469ms, Hashtable: 2906ms
大逆転。結果がひっくり返っている上にかなりの大差が付いている。
結論
少ないデータ量ならばArray
, ArrayList
大量のデータならばHashtable
が有効である。
ちなみにHashtable
は値型を扱わない場合はジェネリッククラスのDictionary
と速度はほとんど変わらなかった。
コメント