#java #performance #optimization #hazelcast #hazelcast-imap
#java #Производительность #оптимизация #hazelcast #hazelcast-imap
Вопрос:
У меня есть следующий контроллер:
@GetMapping("/v1/quotes")
public List<MyQuote> getQuotes() {
return hazelcastMap.values().stream()
.map(r -> new Quote(r))
.collect(Collectors.toList());
}
И это занимает примерно 330 мс, но у меня есть требование улучшить его, чтобы выполнить запрос за 100 мс или быстрее.
Есть идеи, как повысить производительность?
Комментарии:
1. Показывает ли запуск кода через профилировщик, где тратится большая часть времени? Улучшают ли повторные запуски производительность (возможно, Hazelcast передает узел данных локально, вместо того, чтобы извлекать его из удаленного источника во время первого вызова — извините, понятия не имею конкретно о Hazelcast)? Выполняет ли конструктор цитат, который принимает параметр ‘r’, что-нибудь дорогостоящее с точки зрения вычислений?
2. @Не JD, конструктор цитат очень легкий
3. @Не JD 330 мс — это суммарный результат во время тестирования производительности
4. Если у вас нет под рукой чего-то вроде JProfiler или YourKit, попробуйте выполнить несколько вызовов через сеанс VisualVM и посмотрите, на что тратится большая часть времени.
5. @gstackoverflow, сколько у вас данных на этой карте Hazelcast, как записей # or, так и общего размера данных? Кроме того, это встроенное развертывание и развертывание клиента / сервера? Не могли бы вы предоставить немного информации о развертывании. количество узлов, скорость сети и т.д.?
Ответ №1:
Общепринято, что потоки немного менее эффективны, чем способ старой школы с итераторами и / или циклами. Но вы вряд ли получите улучшение на 300 % от этого. Вы могли бы получить улучшение на 10 или 20%… если бы вы преобразовывали обычный файл в памяти Map
. Для Hazelcast IMap
накладные расходы на использование потоков по сравнению с оптимальным кодом будут незначительными.
(Вы должны быть в состоянии проверить это с помощью профилирования и тщательного сравнительного анализа, специфичного для вашего приложения.)
Я думаю, вам придется учесть это при проектировании вашей системы или, возможно, при настройке Hazelcast.
Некоторые из проблем с производительностью того, что вы делаете в настоящее время, подразумеваются IMap
javadoc:
Collection<V> values()
Возвращает клон коллекции значений, содержащихся в этой карте.
Предупреждение: Коллекция НЕ поддерживается картой, поэтому изменения на карте НЕ отражаются в коллекции, и наоборот.
Этот метод всегда выполняется распределенным запросом, поэтому он может вызвать исключение QueryResultSizeExceededException, если GroupProperty .Настроен QUERY_RESULT_SIZE_LIMIT.
Проблемы заключаются в:
-
При вызове
values()
IMap
реализации создается копия значений карты. Затем вы осуществляете потоковую передачу с этой копии, а не непосредственно сIMap
. -
values()
Операция выполняет распределенный запрос. Я подозреваю, что это неизбежно. В любом случае, это, вероятно, будет самой дорогостоящей частью того, что вы делаете.
Комментарии:
1. Я прочитал hazelcast.com/for-faster-hazelcast-queries как вы думаете, setOptimizeQuery может помочь?
2. Это могло бы сработать. Стоит попробовать.
Ответ №2:
Какую сериализацию вы используете? Все данные необходимо будет сериализовать, и это может оказать значительное влияние на производительность. Сериализация Java, как правило, наихудшая с точки зрения пространства и времени. IdentifiedDataSerializable, как правило, является наиболее производительным.