1

コンパイラー用にいくつかのハッシュ関数を書いていますが、__int64データ型を頻繁に使用しています。コンパイラは、さまざまなOSでサポートされることを目的としています(これまでのところサポートされています)。私はそれ__int64が私のターゲットシステムのためにほとんどの主要なC++コンパイラによってコンパイルできるタイプであることを知っているので、それは問題ではありません。私はハッシュ関数を使用して、大きな文字列をより小さく、より速く比較できるようにしています。これらは64ビット対応のOSで驚異的に機能します。しかし、32ビットOSでは、メリットを相殺するのに十分なパフォーマンスの低下がありますか?32ビット整数を使用することもできますが、ハッシュ関数の効果が大幅に低下します。

編集:それはカスタムコードであり、非常に単純です。最初のハッシュ関数は、12文字の英数字(アンダースコアを含む)から一意の64ビット整数を生成します。次に、クラスは64ビットハッシュのアドレスリンクリストを作成して12文字を超えるハッシュを処理し、比較演算子をオーバーロードします。オーバーロードされた比較は短絡され、アドレスリンクリストを比較します。私は自分のマシンでテストを実行して、ランダムに生成された大きなハッシュ(100〜300文字)の速度を自分自身(最悪の場合のシナリオ)と比較しましたが、文字列の比較よりも高速であることがわかりました。ハッシュ生成のオーバーヘッドをより適切にシミュレートするために、事前に生成された大きなハッシュを自分自身と比較する比較テストも実行しました。これはすべて、コード最適化をオフにして実行されています。ハッシュの比較が約10億であるのに対し、文字列の比較は約10億であり、ハッシュは約16%の時間かかりました。ただし、これはすべて64環境で行われました。テストを実行するための32ビットマシンがありません

4

4 に答える 4

2

64ビットサイズの整数は、32ビットx86アーキテクチャではまったく遅くなりません。明らかに、32ビットintほど高速ではありませんが、それほど遅くはありません。x86またはx64に関係なく、ハッシュに64ビット整数を使用することはまったく無謀ではありません。追加のオーバーヘッドは、たとえば、いくつかの不要な動的割り当てや失敗したアルゴリズムと比較して、おそらく最小限に抑えられます。

于 2011-01-12T17:58:43.953 に答える
1

コンパイラが最速のコードを生成すると思うので、4つの32ビット変数を比較する方が2つの64ビット変数を比較するよりも速いとは思いません。プロセッサが64ビット操作をサポートしていない場合、コンパイラは生成します。手作業で行うのと同じように、2つのステップでそれを比較するコード。
もちろん、これはコンパイラによって異なります。


とにかく、比較をさらに高速化するツールは他にもありますが、どこでも利用できるわけではありません。たとえば、一度に8 * 4バイトでも比較できるベクトル演算(SSE拡張命令によって提供される)などです。

コードを可能な限り最適化する必要がある場合は、システムがサポートしている場合にのみ最適化を有効にするために、いくつかのプリプロセッサディレクティブを追加することをお勧めします。

于 2011-01-12T17:57:56.667 に答える
0

ハッシュ関数の効果が大幅に低下することはありますか?テストを実行しましたか?確かに、(i)ハッシュされるアイテムの数が2 ^ 16を大幅に上回り、(ii)64ビットハッシュの計算が安価である場合、64ビットは32ビットよりも優れたハッシュです。あなたの場合、(i)または(ii)(または両方)のどちらが正しいですか?パフォーマンスが重要な場合は、基盤となるオペレーティングシステムに応じて異なるハッシュ関数を使用することをお勧めします。それ以外の場合は、次のように言います。32ビットバージョンと64ビットバージョンを記述します。64ビットシステムと32ビットシステムの両方で試してみてください。そして、あなたはそれが腸を破壊する価値があるかどうかを見るでしょう。

于 2011-01-12T17:57:50.770 に答える
0

私が使用したすべてのハッシュ関数は、問題を回避するためにバイトの配列(uchar)で値を返します。

于 2011-01-12T18:22:24.773 に答える