我对JVM中的堆外存储是个新手,ChronicleMap看起来很适合堆外的东西。但我主要关心的是性能。
我确实用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段,使用默认的膨胀因子,也使用默认的Marshaller。但结果还是一样的。
我只是希望利用Off Heap特性来减少GC暂停,并且不打算使用持久化的东西或复制,也不打算在JVM之外使用map。
所以问题是我应该使用ChronicleMap还是坚持使用ConcurrentHashMap?或者,在使用ChronicleMap的情况下,我还可以使用其他配置来增强性能吗?
提前谢谢。
**使用https://github.com/OpenHFT/Chronicle-Map/blob/master/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java进行基准测试:**
发布于 2020-11-19 22:52:01
首先,我不相信你的测试结果。您没有为您的基准测试提供任何代码,我怀疑基准测试相当不准确(是的,基准测试是相当复杂的主题,如果没有预热和所有相关内容,它是没有意义的)。我们的基准测试结果如下:
-------------------------------- 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
我们有证据表明,编年史地图在大多数情况下比ConcurrentHashMap更好-但这取决于编组的实现情况。
也就是说,取代ConcurrentHashMap并不是编年史地图的主要用例。
https://stackoverflow.com/questions/64893592
复制相似问题