2011-08-09 27 views

答えて

7

ハッシュ値が大きいほど、サイズを事前に設定する価値がある可能性が高いということです。ハッシュに10個のスロットがあり、次々に追加を開始する場合は、a)数が少ない場合はb)小さい場合は(データが少ないため)

しかし、少なくとも1M個のアイテムが必要であることが分かっている場合は、拡張する理由はなく、テーブルが拡大している間は基礎となる拡張データ構造を繰り返しコピーします。

この拡張にご注目ください。あ、多分。現代の機械はかなり速いです、それは上に上がらないかもしれません。しかし、それはヒープ拡張の大きなチャンスであり、GCとあらゆる種類のカスケードを引き起こします。だから、あなたがそれを使うつもりであることを知っているなら、それはパフォーマンスの数少ないミルベリを調整する "安い"修正です。

2

基本的にハッシュパフォーマンスを最適化するための扉です。ハッシュのパフォーマンスは、使用されているハッシュアルゴリズムと処理しているデータの両方に大きく依存するため、経験則を思いつくことはほとんど不可能です。とにかく、何かが言える。

各データ構造では、効率と時間の間に一定のバランスがあることがわかります。ハッシュテーブルは時間効率に関して特に優れており、魅力的な定数(0(1))時間アクセスを提供します。

これは、衝突がない限り、成立します。衝突が発生した場合、アクセス時間は、衝突値に対応するバケットのサイズと線形である。 (詳細はthisをご覧ください)。衝突は「遅い」とは別に、ほとんどの場合、最初にハッシュテーブルを選択する最も重要な側面の1つであるアクセス時間保証が中断されています。

理想的には、ハッシュテーブルは "完璧なハッシング"(実際には処理するデータの種類に合わせてアルゴリズムを微調整できる場合のみ可能です)を目標とすることができますが、これは簡単ではありません一般的な場合に達成する(これは実際には婉曲である)。とにかく、大きなハッシュテーブル(良いハッシュアルゴリズムと一緒に)が衝突の頻度を減らし、メモリを犠牲にしてパフォーマンスを向上させることは事実です。ハッシュテーブルが小さくなればなるほど多くの衝突が発生します(したがって、パフォーマンスが低下し、アクセス時間の保証が低下します)が、メモリの占有量は少なくなります。

したがって、プログラムをプロファイルして、ハッシュテーブルのアクセスがボトルネックになっている(何らかの理由で)場合は、ハッシュスペースのためにより多くのメモリを予約することで解決できます。

いずれにしても、この値をランダムに増やすことはありませんが、プロファイリングを徹底した後でなければなりません。アルゴリズムのperlの使用が(AFAIK)でコンパイルされ、言い換えれば、ハッシュスペースを大きくしても多くの衝突が発生する可能性があります)。

通常、パフォーマンス関連のものと同じように、それは役に立つかもしれないし、あなたの具体的なケースに依存するかもしれない。

5

私は、ハッシュ成長にベンチマーク拡張コストを試してみました:

use Benchmark qw(cmpthese); 

# few values 
cmpthese(-4, { 
    prealloc => sub { 
     my %hash; 
     keys(%hash) = 17576; 
     $hash{$_} = $_ for 'aaa' .. 'zzz'; 
    }, 
    normal => sub { 
     my %hash; 
     $hash{$_} = $_ for 'aaa' .. 'zzz'; 
    }, 
}); 

# more values 
cmpthese(-8, { 
    prealloc => sub { 
     my %hash; 
     keys(%hash) = 456976; 
     $hash{$_} = $_ for 'aaaa' .. 'zzzz'; 
    }, 
    normal => sub { 
     my %hash; 
     $hash{$_} = $_ for 'aaaa' .. 'zzzz'; 
    }, 
}); 

結果は、しかし、ウィルアルトゥングで言及したヒープの断片化を低減することが利点であるかもしれない、大きな最適化のような音はありません。 WinXPマシンでperl 5.12を実行しています。

 Rate normal prealloc 
normal 48.3/s  --  -2% 
prealloc 49.4/s  2%  -- 
     (warning: too few iterations for a reliable count) 
    s/iter normal prealloc 
normal  3.62  --  -1% 
prealloc 3.57  1%  -- 
関連する問題

 関連する問題