首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ChronicleMap是改进的并发HashMap吗?

ChronicleMap是改进的并发HashMap吗?
EN

Stack Overflow用户
提问于 2020-11-18 20:56:36
回答 1查看 439关注 0票数 0

我对JVM中的堆外存储是个新手,ChronicleMap看起来很适合堆外的东西。但我主要关心的是性能。

我确实用config运行了简单的测试。

代码语言:javascript
运行
复制
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);

并发现了以下结果

代码语言:javascript
运行
复制
----- 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进行基准测试:**

EN

回答 1

Stack Overflow用户

发布于 2020-11-19 22:52:01

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

代码语言:javascript
运行
复制
-------------------------------- 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并不是编年史地图的主要用例。

  • 离堆映射能够存储海量数据,这是堆数据结构所无法比拟的,而不会带来巨大的性能损失。
  • 在持久化模式下,它可以在多个进程之间使用
  • 它可以在堆之间复制
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64893592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档