2010/02/01

HashSetのコスト

以前、 επιστημηさんが、「Hashすげー」http://blogs.wankuma.com/episteme/archive/2009/12/06/183571.aspx


で、HashSetの早さを報告されています。

C#でも 3.5から導入されいて、重複要素の排除などに重宝しています。

C#3.0以前で同様のことをするには Dictionary で行えます。 KeyとValueに同値をセットすれば使えますが、Vの部分に冗長性が出ます。 速度コストが気になり試行して見ました。Value部の冗長性がないので、「コスト安であろう」 と勝手に期待してましたが... ▼▼▼テスト結果▼▼▼ AMD64*2:4600+ 2.4G ----------------------------------- mSec mSec ▼回数: 1▼ dict : 0 追加数[ 1] Hash : 38 追加数[ 1] ▼回数: 10▼ dict : 0 追加数[ 10] Hash : 1 追加数[ 10] ▼回数: 100▼ dict : 0 追加数[ 87] Hash : 0 追加数[ 87] ▼回数: 1000▼ dict : 0 追加数[428] Hash : 0 追加数[428] ▼回数: 10000▼ dict : 2 追加数[499] Hash : 2 追加数[499] ▼回数: 100000▼ dict : 20 追加数[499] Hash : 16 追加数[499] ▼回数: 1000000▼ dict : 106 追加数[499] Hash : 88 追加数[499] ▼回数: 10000000▼ dict : 862 追加数[499] Hash : 948 追加数[499] ▼回数:100000000▼ dict :8653 追加数[499] Hash :9196 追加数[499] 僅かですが、「Dictionary<> のほうが早い」場合もありますが、有意差はないようです。 内部の実装がどのようになっているかは、知らないのでずか、同じツリー構造で格納しているのなら、差はもっと小さいと思いますが違うのかな。 これくらの差なら、HashSetを使う価値はありますね。 NameValueCollectionクラスという、Dictionaryの同一キーに対する要素を複数保持できるモノがありますが、知られることなく埋没されていますね。 Dictionary< key , List

0 件のコメント:

コメントを投稿