0

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

我确实使用配置运行了简单的测试

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。但还是一样的结果。

我只是想利用堆外特性来减少 GC 暂停,并且无意使用持久性事物或复制或使用 JVM 之外的映射。

所以问题是我应该使用 ChronicleMap 还是坚持使用 ConcurrentHashMap?或者在 ChronicleMap 的情况下,我可以使用任何其他配置来提高性能?

提前致谢。

** 使用https://github.com/OpenHFT/Chronicle-Map/blob/master/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java进行基准测试:**

在此处输入图像描述

4

1 回答 1

2

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

-------------------------------- 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

而且我们有证据表明,在大多数情况下,Chronicle Map 比 ConcurrentHashMap 更好——但这取决于编组的实施情况。

也就是说,替换 ConcurrentHashMap 并不是 Chronicle Map 的主要用例。

  • 堆外映射能够存储大量数据,这是堆数据结构无法比拟的,而且不会造成巨大的性能损失。
  • 在持久模式下,它可以在多个进程之间使用
  • 它可以在主机之间复制
  • ETC
于 2020-11-19T14:52:01.207 回答