Я работаю над высокопроизводительным 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...