ChronicleMap - это улучшенная Concurrent HashMap?

Я новичок в хранении вне кучи в 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

Скорость чтения довольно низкая по сравнению с Concurrent HashMap.

Я пробовал использовать сегменты 1024/2048 с коэффициентом раздувания по умолчанию, а также с Marshaller по умолчанию. Но результаты все те же.

Я только хочу воспользоваться функцией Off Heap для уменьшения пауз сборщика мусора и не намерен использовать постоянную вещь или репликацию или использование карты за пределами JVM.

Итак, вопрос в том, следует ли мне использовать ChronicleMap или придерживаться ConcurrentHashMap? Или есть какие-то другие конфиги, которые я могу использовать для повышения производительности в случае ChronicleMap?

Заранее спасибо.

** Сравнительный анализ с использованием https://github.com/OpenHFT/Chronicle-Map/blob/master/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java:**

1 ответ

Во-первых, я не верю вашим результатам тестов. Вы не предоставляете никакого кода для своего теста, и я подозреваю, что тест довольно неточен (да, тестирование - довольно сложная тема, и без разминки и всего прочего это бессмысленно). Наш тест дает мне следующее:

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

  • Карты Offheap способны хранить огромные объемы данных, несравнимые со структурами данных в куче, без огромных потерь производительности.
  • В постоянном режиме его можно использовать между несколькими процессами
  • Его можно реплицировать между хостами
  • и т.д
Другие вопросы по тегам