JIT-оптимизации работают так хорошо именно потому, что они оптимизируют то, что делает ваш код на самом деле , а не то, что может делать в разных случаях.
Это даже возможночто код JITted отличается на разных прогонах из-за разных входных данных.Или даже он может быть повторно оптимизирован несколько раз, когда обстоятельства меняются.
Другими словами: без реальных данных JVM не сможет выполнить хорошую работу по оптимизации кода.(т. е. он может выполнять только «статические» оптимизации)
Но, в конце концов, если вы получаете такое большое улучшение (30х - это много!), вполне вероятно, что это либо
- не код, а что-то еще (например, кэш файлов или базы данных)
- очень неоптимальный код на уровне исходного кода.(как некоторые тяжелые вычисления, которые могут выходить из узких циклов)
РЕДАКТИРОВАТЬ:
После просмотра вашего кода в большом цикле на Literas.prepareLiteras()
Вы постоянно звоните path.contains(p)
с разными точками, но одним и тем же путем.SimplePath.contains()
создает ограничивающую фигуру каждый раз, когда она вызывается, поэтому вы в конечном итоге создаете одну и ту же форму снова и снова.Это яркий пример того, что должно быть извлечено из внутреннего цикла.
Я не думаю, что JIT может оптимизировать весь этот метод, но в некоторых крайних случаях он может преобразовать getShape()
в нечтоспециализируется для одного пути и перекомпилируется снова для следующего пути.Плохое использование смартов JVM, а?