Оптимизация Java: (Hotspot / Dalvik) Оптимизация окончательного метода, возвращающего константу? - PullRequest
6 голосов
/ 11 июля 2011

Может кто-нибудь сказать мне, достаточно ли Hotspot или Dalvik достаточно умны, чтобы встроить вызовы в последний метод, возвращающий постоянное (статическое конечное) значение int?В идеале вызов метода должен быть заменен константой.Это может быть либо во время загрузки класса, либо через JIT.

Это имеет значение при разработке кода, над которым я работаю.

Ответы [ 3 ]

12 голосов
/ 11 июля 2011

Я думаю, что ответ «нет, оптимизация не произойдет из-за отсутствия или наличия ключевого слова final», по крайней мере на виртуальной машине HotSpot.Но оптимизация скорее всего произойдет из-за других факторов.

Вот что говорит Брайан Гетц в этой статье (извините за длинную цитату):

Как и во многих мифах о производительности Java, ошибочное мнение о том, что объявление классов или методов как конечных результатов для повышения производительности широко распространено, но редко исследуется.Аргумент гласит, что объявление метода или класса как конечного означает, что компилятор может активнее вызывать вызовы метода, потому что он знает, что во время выполнения это определенно версия метода, который будет вызываться.Но это просто неправда.Тот факт, что класс X скомпилирован с конечным классом Y, не означает, что одна и та же версия класса Y будет загружена во время выполнения.Таким образом, компилятор не может встроить такие вызовы кросс-класса безопасно, окончательно или нет.Только если метод является закрытым, компилятор может его встроить свободно, и в этом случае ключевое слово final будет избыточным.

С другой стороны, среда выполнения и JIT-компилятор имеют больше информации о том, какие классыфактически загружены и могут принимать гораздо лучшие решения по оптимизации, чем компилятор.Если среда выполнения знает, что не загружены классы, расширяющие Y, то она может безопасно встроить вызовы методов Y независимо от того, является ли Y окончательным (при условии, что она может аннулировать такой JIT-скомпилированный код, если подкласс Yпозже загружен).Таким образом, реальность такова, что, хотя final может быть полезной подсказкой для тупого оптимизатора времени выполнения, который не выполняет глобального анализа зависимостей, его использование на самом деле не позволяет выполнять очень много оптимизаций во время компиляции и не требуется интеллектуальнымJIT для выполнения оптимизаций во время выполнения.

Есть также хороший пост, почему final больше не является финальным, по крайней мере, в Java 5 .

0 голосов
/ 02 августа 2011

В качестве альтернативы, Soot , как ожидается, оптимизирует байт-код Java для такого случая.

0 голосов
/ 11 июля 2011

Встраивание - это то, что JIT-компилятор может сделать, если обнаружит горячую точку , метод в байт-коде, который вызывается так часто, что он вероятно, стоит потратить некоторое время процессора на компиляцию байтового кода в машинный код.

Очень велика вероятность того, что JIT-компилятор встроит метод final (так как его нельзя перезаписать). И шансы будут еще лучше, если этот метод просто вернет постоянное значение.

Но я понимаю, что если вызывающий метод не является горячей точкой, то он не будет скомпилирован и не будет никакого включения методов final.

( Источник информации на немецком языке )

...