パフォーマンス ConcurrentHashmapとHashMapの比較
質問
ConcurrentHashMapのパフォーマンスは、HashMapと比較して、特に.get()操作でどのようになりますか(私は、多分0-5000の間の範囲で、少数のアイテムのみの場合に特に興味があります)。
HashMapの代わりにConcurrentHashMapを使用しない理由はあるのでしょうか?
(null値が許されないのは知っています)。
更新
同時アクセスの場合の性能は明らかに低下しますが、同時アクセスがない場合の性能はどのように比較されるのでしょうか?
どのように解決するのですか?
このトピックはとても古いものですが、この件に関してまだ誰もテストを提供していないことにとても驚いています。使用方法
ScalaMeter
のテストを作成しました。
add
,
get
と
remove
の両方に対して
HashMap
と
ConcurrentHashMap
の2つのシナリオで
- シングルスレッドでの使用
-
使用可能なコアの数だけスレッドを使用する。
ただし
HashMap
はスレッドセーフではないので、単純に別々のHashMap
を各スレッド用に作成し、1つの共有ConcurrentHashMap
.
コードが利用できます 私のレポで .
結果は以下の通りです。
- X軸(サイズ)はマップに書き込まれた要素数を示す。
- Y軸(値)は時間(ミリ秒)
概要
-
データをできるだけ高速に処理したい場合は、利用可能なすべてのスレッドを使用します。それは当然のことのように思えますが、各スレッドには全作業の1/nの作業があります。
-
シングルスレッドアクセスを選択した場合、使用する
HashMap
を使用すると、単純に速くなります。もしadd
メソッドでは、3 倍の効率にさえなります。ただget
が速いのはConcurrentHashMap
の方が速いですが、それほどでもありません。 -
で操作する場合
ConcurrentHashMap
を操作する場合、別々のスレッドで操作するのと同じような効果があります。HashMaps
で操作するのと同じ効果があります。そのため、異なる構造でデータを分割する必要はありません。
要約すると
ConcurrentHashMap
はシングルスレッドで使うと性能が落ちますが、より多くのスレッドを追加すれば確実に高速化されます。
テストプラットフォーム
AMD FX6100、16GB RAM
Xubuntu 16.04、Oracle JDK 8 update 91、Scala 2.11.8
関連
-
NullPointerException - java.lang.
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
-
[解決済み] ConcurrentHashMapに対するConcurrentHashSetが存在しない理由
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
-
[解決済み] Java HashMapのパフォーマンス最適化/代替案
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
シェルコマンドやスクリプトのJavaコール
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
代入の左辺は変数でなければならない 解答
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
アクセス制限の解決方法: ---- in Java
-
IDEAError:javaの依存性エラー。Annotation processing is not supported for module cycles...(アノテーション処理はモジュールサイクルではサポートされていません。
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。