Trove4j:高性能コレクション

背景


3年生のとき、実験室のワークショップで数値的手法をプログラムする機会がありました。 (Javaで)実装され、さらに正しい結果を生成しましたが、1つの問題がありました:動作が遅すぎました。 寸法を少し大きくする必要がありました。それだけです-他の重要なことをするために、鈴を鳴らして行くことができます。



メソッドは反復的で、各反復で古い値が更新されました。 プロファイリングでは、Map <Integer、Double>のような連想配列の操作には、多くの時間がかかることが示唆されました。



最初に考えたのは、「さあ、すべてをきれいな配列に変換します」-すぐに削除されました。 「Cですべてを書き換える」という選択肢すら考えていませんでした。 そのため、プリミティブのコレクションを操作できる既製のソリューションを探し始めました。 見つかった2つ: Trove4jApache Common Primitives



最初のオプションを選択しました。 著者は、生産性の向上とメモリ消費の削減を宣言しています。





インストールする


そこで、上記のリンクをクリックして、アセンブリとjavadocsをダウンロードすることで、勉強を始めました。



ソースコードは、提供されたジェネレーターとAntスクリプトを使用してテンプレートから生成されます。 それは合理的に見えます 一度だけコードを変更することができ、変更は対応するすべてのクラスに反映されます。



命名規則を理解する


Trove4jは、特定のクラス命名規則を使用します。

著者によると、最初の文字はTであり、Troveライブラリの一部であることを示しています。

次に、型名:Int、Double、Objectなどが来ます。

次に、コレクションの名前:ArrayList、HashSet、HashMap。

例: TByteArrayListTIntHashSetTFloatObjectHashMapTDoubleDoubleHashMap

THashSetTHashMapは別です。



JDKコレクションとの違いを探す


著者は、ハッシュテーブル用のかなり柔軟なハッシュ戦略管理メカニズムを提供しています。 デフォルトの戦略がありますが、必要に応じて、実装に置き換えることができます。 しかし、実際には、必要なときに会えませんでした。



JDK Collections Frameworkとの最も重要な違いは、Trove4jではすべてのハッシュテーブルがリンクリストではなく配列上に構築されることです。 これにより、要素間のリンクを排除することで、メモリを大幅に節約できます。



「Troveマップ/セットは、JDKハッシュテーブルで採用されている連鎖アプローチの代わりに、オープンアドレス指定を使用します。 これにより、テーブル内のすべてのアイテムに対してMap.Entryラッパーオブジェクトを作成する必要がなくなるため、ハッシュテーブルアルゴリズムのパフォーマンスのO(大)が減少します。 Troveのマップ/セットで使用されるテーブルのサイズは常に素数であり、テーブル全体でエントリが最適に分布する確率が向上するため、パフォーマンスが低下する衝突の可能性が低くなります。 Troveセットはマップによって支援されないため、THashSetを使用しても、未使用の「値」配列は割り当てられません。




JDKコレクションからTrove4jへの移行


THashSetはSetを実装しているため、その実装は最も簡単です。 ハッシュテーブルの残りとすべての連想配列は、JDKからの対応するインターフェイスを実装しませんが、gnu.trove.decoratorパッケージには、これらのクラスをインターフェイスと一致させる包括的なラッパーセットがあります。



結果を得る


Trove4jを使用してラボを書き換えた後、計算速度は著しく向上しました。 さて、ラボは数日で安全に引き渡されました。



その後の使用


Trove4jは作業プロジェクトに実装されました。これは、膨大な計算操作を実行するシミュレーションモジュールにすぐに定着し、不可欠なツールになりました。

HashSetとHashMapから対応するものへの移行により、メモリの消費量を3分の1削減できました。 作業速度も向上しました。



PS

JAVAで公開したかったのですが、カルマが足りませんでした。



All Articles