chronicmap是一个改进的并发hashmap吗?

hsvhsicv  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(557)

我对jvm中的堆外存储还比较陌生,chronicmap看起来很适合堆外存储。但我最关心的是性能。
我用config运行了一个简单的测试

  1. ChronicleMapBuilder<IntValue, BondVOImpl> builder =
  2. ChronicleMapBuilder.of(IntValue.class, BondVOImpl.class)
  3. .minSegments(512)
  4. .averageValue(new BondVOImpl())
  5. .maxBloatFactor(4.0)
  6. .valueMarshaller(new BytesMarshallableReaderWriter<>(BondVOImpl.class))
  7. .entries(ITERATIONS);

并发现以下结果

  1. ----- Concurrent HASHMAP ------------------------
  2. Time for putting 7258
  3. Time for getting 678
  4. ----- CHRONICLE MAP ------------------------
  5. Time for putting 4704
  6. Time for getting 2246

与并发hashmap相比,读取性能相当低。
我试过1024/2048段,使用默认膨胀因子,也使用默认封送器。但还是一样的结果。
我只想利用堆外特性来减少gc暂停,而不打算使用持久性的东西或复制,也不打算在jvm之外使用map。
所以问题是我应该使用编年史Map还是坚持使用concurrenthashmap?或者有任何其他配置,我可以用来提高性能的情况下,编年史Map?
提前谢谢。

基准测试使用https://github.com/openhft/chronicle-map/blob/master/src/test/java/net/openhft/chronicle/map/perf/mapjlbhtest.java :

xghobddn

xghobddn1#

首先,我不相信你的测试结果。你没有为你的基准测试提供任何代码,我怀疑基准测试是相当不准确的(是的,基准测试是相当复杂的主题,没有预热和所有相关的东西它是没有意义的)。我们的基准给了我:

  1. -------------------------------- SUMMARY (Read) -----------------------------------------------------------
  2. Percentile run1 run2 run3 % Variation
  3. 50: 0.16 0.16 0.21 17.15
  4. 90: 0.23 0.20 0.35 33.48
  5. 99: 0.46 0.43 0.78 35.19
  6. 99.7: 0.74 1.22 1.59 16.83
  7. 99.9: 1.52 1.85 2.84 26.06
  8. worst: 36.46 5187.58 161.09 95.41
  9. -------------------------------------------------------------------------------------------------------------------
  10. -------------------------------- SUMMARY (Write) -----------------------------------------------------------
  11. Percentile run1 run2 run3 % Variation
  12. 50: 2.67 2.69 3.05 8.21
  13. 90: 3.02 2.95 3.97 18.75
  14. 99: 4.51 6.20 9.06 23.50
  15. 99.7: 5.86 9.28 15.55 31.07
  16. 99.9: 930.56 22.10 964.86 96.60
  17. worst: 1357.31 226033.66 233373.70 2.12
  18. -------------------------------------------------------------------------------------------------------------------

数字以微秒为单位,这里是基准代码https://github.com/openhft/chronicle-map/blob/master/src/test/java/net/openhft/chronicle/map/perf/mapjlbhtest.java
而且我们有证据表明,在大多数情况下,编年史Map比concurrenthashmap更好——但这取决于编组的实现情况。
也就是说,替换concurrenthashmap不是chronicle map的主要用例。
堆外Map能够存储大量与堆数据结构不兼容的数据,而不会造成巨大的性能损失。
在持久化模式下,它可以在多个进程之间使用
它可以在主机之间复制

展开查看全部

相关问题