1. ホーム
  2. java

パフォーマンス ConcurrentHashmapとHashMapの比較

2023-10-03 14:25:48

質問

ConcurrentHashMapのパフォーマンスは、HashMapと比較して、特に.get()操作でどのようになりますか(私は、多分0-5000の間の範囲で、少数のアイテムのみの場合に特に興味があります)。

HashMapの代わりにConcurrentHashMapを使用しない理由はあるのでしょうか?

(null値が許されないのは知っています)。

更新

同時アクセスの場合の性能は明らかに低下しますが、同時アクセスがない場合の性能はどのように比較されるのでしょうか?

どのように解決するのですか?

このトピックはとても古いものですが、この件に関してまだ誰もテストを提供していないことにとても驚いています。使用方法 ScalaMeter のテストを作成しました。 add , getremove の両方に対して HashMapConcurrentHashMap の2つのシナリオで

  1. シングルスレッドでの使用
  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