Я работаю над высокопроизводительным Android-приложением (игрой), и хотя я сначала пытаюсь кодировать удобочитаемость, мне нравится держать в голове картину того, что происходит под капотом. С С++ я разработал довольно хорошую интуицию о том, что компилятор будет делать и не будет делать для меня. Я пытаюсь сделать то же самое для Java/Android.
Отсюда этот вопрос. Я мог найти очень мало об этой теме в Интернете. Будет ли компилятор Java, конвертер Dalvik (dx) и/или JITter (на Android 2.2+) выполнять оптимизации, например, следующие:
-
Встраивание метода. При каких условиях?
private
методы всегда могут быть смещены; это будет сделано? Как насчет методовpublic final
? Методы на объектах других классов?static
методы? Что делать, если тип выполнения объекта может быть легко выведен компилятором? Должен ли я объявлять методы какfinal
илиstatic
по возможности? -
Исключение общего подвыражения. Например, если я дважды получаю доступ к
someObject.someField
, поиск будет выполняться только один раз? Что, если это вызов геттеру? Что делать, если я использую некоторое арифметическое выражение дважды; будет ли он оцениваться только один раз? Что делать, если я использую результат некоторого выражения, значение которого я не знаю, как верхнюю границу циклаfor
? -
Проверка границ поиска массива. Остановит ли эта цепочка в определенных условиях, как архетипическая петля
for
? -
Вставка значений. Будет ли доступ к некоторым
public static final int
всегда включенным? Даже если они в другом классе? Даже если они находятся в другом пакете? -
Прогнозирование ветвей. Насколько это важно? Является ли ветвление большим успехом на обычном устройстве Android?
-
Простая арифметика. Будет ли заменен
someInt * 2
наsomeInt << 1
?
Etcetera...