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 способны хранить огромные объемы данных, несравнимые со структурами данных в куче, без огромных потерь производительности.
- В постоянном режиме его можно использовать между несколькими процессами
- Его можно реплицировать между хостами
- и т.д