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

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

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

ChronicleMapBuilder<IntValue, BondVOImpl> builder =
                ChronicleMapBuilder.of(IntValue.class, BondVOImpl.class)
                .minSegments(512)
                .averageValue(new BondVOImpl())
                .maxBloatFactor(4.0)
                .valueMarshaller(new BytesMarshallableReaderWriter<>(BondVOImpl.class))
                .entries(ITERATIONS);

并发现以下结果

----- Concurrent HASHMAP ------------------------
Time for putting 7258
Time for getting 678

----- CHRONICLE MAP ------------------------
Time for putting 4704
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#

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

-------------------------------- SUMMARY (Read) -----------------------------------------------------------
Percentile   run1         run2         run3      % Variation
50:             0.16         0.16         0.21        17.15
90:             0.23         0.20         0.35        33.48
99:             0.46         0.43         0.78        35.19
99.7:           0.74         1.22         1.59        16.83
99.9:           1.52         1.85         2.84        26.06
worst:         36.46      5187.58       161.09        95.41
-------------------------------------------------------------------------------------------------------------------
-------------------------------- SUMMARY (Write) -----------------------------------------------------------
Percentile   run1         run2         run3      % Variation
50:             2.67         2.69         3.05         8.21
90:             3.02         2.95         3.97        18.75
99:             4.51         6.20         9.06        23.50
99.7:           5.86         9.28        15.55        31.07
99.9:         930.56        22.10       964.86        96.60
worst:       1357.31    226033.66    233373.70         2.12
-------------------------------------------------------------------------------------------------------------------

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

相关问题