@ApolonIn
Начинающий программист

Как «разогреть» метод в Java?

Здравствуйте, столкнулся с такой проблемой:

Я заметил что в Java методам необходимо дополнительное время чтобы "прогрузиться" при первом/втором использовании.
Следовательно время выполнения первого, а иногда и второго вызова метода в цикле в 2,5-1,5 раза больше последующих.
Пример: время выполнения метода 1 и метода 2 (миллисекунды) в цикле:

Метод 1: 481, 275, 287, 252, 256, 246, 242, 268, 235, 236, 250, 258, 259, 245, 253, 240
Метод 2: 334, 102, 70, 80, 90, 80, 90, 70, 90, 80, 80, 72, 80, 70, 81, 70

Оба метода посылают HTTP запрос, но каждый на разные сервера.

Вопрос: есть ли способ сделать так чтобы первые вызовы были такими же быстрыми как и последующие?

P.S. У меня эти методы вызываются в отдельном потоке, когда есть потребность, не регулярно, и каждый раз они выполняются как в первый раз.
  • Вопрос задан
  • 519 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
JIT-компилятору нужно выполнить код, чтобы понять, как его комплилировать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev
software engineer
Посмотрите опции запуска java-машины. Там есть варианты отложенной компиляции и форсированной.

Но в случае компиляции до запуска, и в случае компиляции во время выполнения, результат будет разный, поскольку во время выполнения будут собраны некоторые метрики, которые могут помочь скомпилировать более оптимизированный код.
Ответ написан
Комментировать
@poiuy7
1) Возможно у вас есть lazy-инициализации
2) Посмотреть про "java -server" vs "java -client"
Ответ написан
Комментировать
@void_phoenix
Java использует счетчик вызовjd метода, чтобы понять как часто он используется и нужно ли его компилировать.
Регулируется флагом
-XX:CompileThreshold=N.
Значение по умолчанию для N - 1500 для клиентской VM (32 битные системы и, скорее всего для tiered compilation, которая наверняка у вас и используется).
Нужно еще учесть, что скорее всего именно ваш метод компилироваться не будет. Будут компилироваться действительно часто используемые методы, типа toString, equals и т.д.

Вопрос в том, действительно ли у вас есть методы, которые за 2 запроса вызываются 1500 раз?
Может быть просто вы используете библиотеку для HTTP запросов, которая кеширует какой-нибудь контекст при первых вызовах? Обычно в сетевых приложениях время запроса намного превышает время работы самого кода, так что я бы в эту сторону копал.

UPD: Вообще, если проект не коммерческий, возьмите java mission control и посмотрите на что у вас там реально тратится время.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы