У меня есть приложение с низкой пропускной способностью с высокой пропускной способностью (3000 запросов/сек, 100 мс на запрос), и мы активно используем Java 8 ConcurrentHashMap
для выполнения поиска. Обычно эти карты обновляются одним фоновым потоком и несколькими потоками, считанными с этих карт.Java 8 Concurrent Hash Map получить производительность/альтернативу
Я вижу узкое место в производительности, и при профилировании я нахожу ConcurrentHashMap.get
как точку доступа и большую часть времени.
Я другой случай, я вижу ConcurrentHashMap.computeIfAbsent
являюсь точкой доступа, хотя отображение-функция имеет очень малую задержку и профиль показывает computeIfAbsent
расходов на 90% время, выполняющиеся себя, и очень меньше времени при выполнении отображения-функции.
Вопрос в том, можно ли улучшить производительность? У меня около 80 потоков одновременно с CHM.
Используется ли ваш файл hasmap для чтения значений, записывая значения, оба? Очень сложно помочь вам, если у нас больше нет информации о самом алгоритме. –
Вы должны [prescreen] (https://github.com/ben-manes/caffeine/wiki/Benchmarks) 'computeIfAbsent' оптимистичным' get', чтобы избежать штрафа за блокировку при чтении. –
@GuillaumeF. для (чтение при 3000 Rps), и запись будет примерно 100 кпс. Ben Manes: можете ли вы рассказать о –