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と速度はほとんど変わらなかった。

コメント