与 HashMap 相比,ConcurrentHashMap 的性能如何,尤其是 .get() 操作(我对只有少数项目的情况特别感兴趣,范围可能在 0-5000 之间)?

有什么理由不使用 ConcurrentHashMap 而不是 HashMap 吗?

(我知道不允许空值)

更新

只是为了澄清,显然在实际并发访问的情况下性能会受到影响,但是在没有并发访问的情况下如何比较性能?

最佳答案

我真的很惊讶地发现这个话题如此古老,而且还没有人提供任何关于这个案例的测试。使用 ScalaMeter 我已经为 addget 和 0x2518122231343141 创建了 0x25181223141 和 0x2518122231343141 的测试,分别用于 2134 和 2134 两种场景:

  • 使用单线程
  • 使用尽可能多的线程,因为我有可用的内核。请注意,因为 remove 不是线程安全的,我只是为每个线程创建了单独的 HashMap ,但使用了一个共享 ConcurrentHashMap

  • 代码可用 on my repo

    结果如下:
  • X 轴(大小)表示写入 map 的元素数量
  • Y 轴(值)以毫秒为单位表示时间

  • java - 性能 ConcurrentHashmap 与 HashMap-LMLPHP
    java - 性能 ConcurrentHashmap 与 HashMap-LMLPHP
    java - 性能 ConcurrentHashmap 与 HashMap-LMLPHP

    摘要
  • 如果您想尽快对数据进行操作,请使用所有可用线程。这似乎很明显,每个线程都有 1/n 的全部工作要做。
  • 如果您选择单线程访问使用 HashMap ,它只是更快。对于 HashMap 方法,它的效率甚至提高了 3 倍。只有 ConcurrentHashMapHashMap 上更快,但不多。
  • 当使用多个线程在 add 上操作时,对于每个线程在单独的 get 上操作同样有效。因此无需将您的数据划分为不同的结构。

  • 综上所述,ConcurrentHashMap在单线程使用时性能较差,但增加更多线程来完成工作肯定会加快进程。

    关于java - 性能 ConcurrentHashmap 与 HashMap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1378310/

    10-15 13:25