6

この非常に古い投稿に加えて、プリミティブを使用し、多くのHashSetsを含むアプリケーションの高速化を提供するものが必要ですIntegers

Set<Integer> set = new HashSet<Integer>();

したがって、人々はGuava、Javalution、Troveのようなライブラリについて言及しますが、ベンチマークとパフォーマンス結果、または少なくとも良い経験から得られる良い答えに関して、それらの完全な比較はありません。私が見るところから、多くの人がTroveをお勧めしますTIntHashSetが、他の人はそれはそれほど良くないと言います。Guavaは超クールで扱いやすいと言う人もいますが、私は美しさと保守性を必要とせず、実行時間だけが必要なので、PythonのスタイルGuavaは家に帰ります:) Javalution?私はウェブサイトにアクセスしましたが、私には古すぎるようで、風変わりです。

ライブラリは達成可能な最高の時間を提供する必要があり、メモリは重要ではありません。

「Javaで考える」を見ると、キーとしてカスタムHashMapを作成するというアイデアがありint[]ます。HashSetだから私は、または単にダウンロードして素晴らしいライブラリを使用するのと同じようなものを見たいと思います。

編集(以下のコメントに応じて)したがって、私のプロジェクトでは、約50のHashSet<Integer>コレクションから開始し、次に関数を約1000回呼び出して、内部で最大10HashSet<Integer>のコレクションを作成します。初期パラメータを変更すると、数値が指数関数的に増加する可能性があります。私はそれらのコレクションで、メソッドのみを使用します。そのため、これらのコレクションが選択されadd()ましcontains()た。clear()

次に、実装するライブラリなどを見つけますが、自動ボクシングのオーバーヘッドと、おそらく私が知らない他の何かのHashSetために、それをより速く実行します。Integer実際、私はデータが入ってくるときにintを使用して、それらをそれらに格納していHashSetます。

4

3 に答える 3

4

Troveは素晴らしい選択です。

ジェネリックコレクションよりもはるかに高速である理由は、メモリの使用です。

Ajava.util.HashSet<Integer>java.util.HashMap<Integer, Integer>内部で使用します。ではHashMap、各オブジェクトはに含まれていEntry<Integer, Integer>ます。Entryこれらのオブジェクトは、実際の整数の+16バイト+実際のハッシュテーブルの4バイトに対して推定24バイトを取ります。これにより、Troveの4バイトとは対照的に、最大11倍のメモリオーバーヘッドが発生します(メインテーブルで占有されていない全体の場合、実際の違いは小さくなります)。

これらの実験も参照してください。

http://www.takipiblog.com/2014/01/23/java-scala-guava-and-trove-collections-how-much-can-they-hold/

于 2014-06-18T09:38:34.007 に答える
2

Java用の高性能プリミティブコレクション(HPPC)をご覧ください。これは、効率を高めるために慎重に設計された、成熟したトローブの代替手段です。IntOpenHashSetについては、JavaDocを参照してください。

于 2014-06-18T12:54:52.417 に答える
0

HashSetの作成中に、初期容量と負荷率のパラメーターを操作してみましたか?

HashSetドキュメント

ご想像のとおり、初期容量とは、作成時に空のハッシュセットがどれだけ大きくなるかを指し、loadfactorは、ハッシュテーブルをいつ拡張するかを決定するしきい値です。通常、使用済みバケットと合計バケットの比率を3分の2未満に維持する必要があります。これは、ハッシュテーブルで良好な安定したパフォーマンスを実現するための最良の比率と見なされます。

ハッシュテーブルの動的rezing

したがって、基本的には、ニーズに合った初期容量を設定し(ハッシュテーブルが大きくなったときに値を再作成して再割り当てしないようにするため)、スイートスポットが見つかるまで負荷率をいじってみてください。

特定のデータ分散と値の設定/取得では、負荷率を低くすると役立つ場合があります(負荷率を高くすることはほとんどありませんが、マイレージは異なる場合があります)。

于 2012-08-07T17:05:49.173 に答える