問題タブ [koloboke]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - マルチキーマップ - 性能比較
環境
私たちのアプリケーションは、高速なルックアップを可能にするために、さまざまな種類のマップのメモリに大量のデータを格納します。シンプルにするために (プリミティブ マップは考慮しない)、常に 1 つ以上のキーを持つマップです。パフォーマンスは私たちにとって大きな要件です。
問題
最もパフォーマンスの高いマップの実装を見つけたかったので、ここで提案されているように、これらの実装を比較しました。
3 つのキー専用の java.util.HashMap に基づくマップ (ネストされたマップ) のマップ:
/li>java.util.HashMap のラッパー キー (キーとしてのタプル)
/li>net.openhft.koloboke.collect.map.hash.HashObjObjMap のキーとしてのタプル。これによると、最速のマップ (の 1 つ) になります。
/li>
期待
- ネストされたマップは、GET が最も速く、PUT が最も遅くなります。
- Koloboke ハッシュ マップは、jdk HashMap よりも高速になります。
結果
基準
注:プリミティブ マップの使用を提案しないでください。(値) としての整数は、安価なオブジェクトの単なる例です。
質問
- koloboke マップが jdk マップの 2.5 倍遅いのはなぜですか?
- ネストされたマップが高速にならないのはなぜですか? (タプルキーオブジェクトの割り当てオーバーヘッドが大きくなると予想されます。)
- それとも私のベンチマークが間違っていますか?では、どうすればそれを改善できますか?
アップデート
@leventov からの良いアドバイスに基づいて、ベンチマークを変更し、ハッシュコードをキャッシュする (そしてより良い分散を持つ) トリプル実装も試しました - テストは Tuple2 と名付けられました。
結果は次のとおりです。
概要
- 「タプル」アプローチは、キー クラスのハッシュ コード関数がキャッシュされていないか、十分に分散されていない場合、特に koloboke の場合、非常に遅くなる可能性があります。
- ここでも結論付けられているように (この (Obj-Obj) の場合)、 java.util.HashMap は「非常に」高速です。
java - Koloboke Hashmap を変更しながら反復する
大きなハッシュマップ (~3M エントリ) があり、KolobokeLongIntMap
を使用して実装しています。マップ内のキーを反復処理する必要がありますが、途中でマップを変更できる必要があります。一部の変更は構造的なもの (エントリの追加/削除) である場合があります。
絶対に必要でない限り、同期された実装やコピーされたキーリストに代償を払いたくありません。反復の結果は多かれ少なかれランダムになり、一部のキーが省略されたり、他のキーが 2 回取得される可能性があることはわかっていますが、これはアプリケーションでは問題になりません。
そのようなマップの反復を達成する方法はありますか? ご意見をお寄せいただきありがとうございます。
java - コロボーケ マップの作成中に例外が発生しました。(内部実行時エラー) java.util.NoSuchElementException
コロボーケ マップを作成しようとすると、次の例外が発生します。私の地図はこんな感じです。
実行時の例外。
https://github.com/leventov/Koloboke/issues/34で同様の問題が報告されています。修正は、クラスパスに api と impl の両方の jar を含めることです。System.getProperty("java.class.path")
クラスパスに両方のjarを表示するを使用して、クラスパスを確認しました。
誰でもこの問題で私を助けることができますか?
java - 自動ボクシングを避けるために、最適化された Map(k,v) (long, long[]) が必要です
基本的に次のようなコードがあります。
値は順不同で入力されます。つまり
if ids = ['id1','id2',...]
、値は次のようになります。順不同values = [['id2val1','id2val2',..]['id1val1','id2val2',...],..]
の実行は避けられません。私が検討しているアプローチは Map を使用する
Map<Long,Long[]>
こと
ですが、Java の自動ボクシングにより、JAVA ジェネリックを使用することはできません。
不必要な自動ボクシングを避けるために、プリミティブを使用する最適化されたデータ構造ライブラリを介して実行できるかどうかを知りたいのですが、Koloboke
&のようなライブラリを見ていますFastutil
。
データ構造の推奨事項を探しています