Я заметил что в Java методам необходимо дополнительное время чтобы "прогрузиться" при первом/втором использовании.
Следовательно время выполнения первого, а иногда и второго вызова метода в цикле в 2,5-1,5 раза больше последующих.
Пример: время выполнения метода 1 и метода 2 (миллисекунды) в цикле:
Игорь: не уверен на 100%, но подозреваю, что нет. JIT-компилятор будет пытаться перекомпилировать блок кода чтобы исключить, что условия его исполнения изменились и теперь кэшированный код может быть неоптимален.
Посмотрите опции запуска java-машины. Там есть варианты отложенной компиляции и форсированной.
Но в случае компиляции до запуска, и в случае компиляции во время выполнения, результат будет разный, поскольку во время выполнения будут собраны некоторые метрики, которые могут помочь скомпилировать более оптимизированный код.
Java использует счетчик вызовjd метода, чтобы понять как часто он используется и нужно ли его компилировать.
Регулируется флагом
-XX:CompileThreshold=N.
Значение по умолчанию для N - 1500 для клиентской VM (32 битные системы и, скорее всего для tiered compilation, которая наверняка у вас и используется).
Нужно еще учесть, что скорее всего именно ваш метод компилироваться не будет. Будут компилироваться действительно часто используемые методы, типа toString, equals и т.д.
Вопрос в том, действительно ли у вас есть методы, которые за 2 запроса вызываются 1500 раз?
Может быть просто вы используете библиотеку для HTTP запросов, которая кеширует какой-нибудь контекст при первых вызовах? Обычно в сетевых приложениях время запроса намного превышает время работы самого кода, так что я бы в эту сторону копал.
UPD: Вообще, если проект не коммерческий, возьмите java mission control и посмотрите на что у вас там реально тратится время.