Какие оптимизации я могу ожидать от Dalvik и набора инструментов Android?

Я работаю над высокопроизводительным приложением для Android (игрой), и хотя я сначала пытаюсь кодировать для удобства чтения, мне нравится держать в уме картину того, что происходит под капот. С C ++ у меня появилась довольно хорошая интуиция относительно того, что компилятор будет делать, и я выиграл » не делать для меня. Я пытаюсь сделать то же самое для Java / Android.

Отсюда вопрос. Я очень мало мог найти в сети по этой теме. Будет ли компилятор Java, преобразователь Dalvik (dx) и / или JITter (на Android 2.2+) выполнять оптимизацию, подобную следующей?

  • Встраивание методов. В каких условиях? частные методы всегда можно безопасно встроить; это будет сделано? Как насчет публичных финальных методов? Методы на объектах других классов? статические методы? Что, если тип среды выполнения объекта может быть легко определен компилятором? Следует ли объявлять методы как final или static , где это возможно?

  • Исключение общих подвыражений. Например, если я дважды обращаюсь к someObject.someField , будет ли поиск выполняться только один раз? Что, если это вызов геттеру? Что, если я дважды использую какое-нибудь арифметическое выражение; будет ли он оцениваться только один раз? Что, если я использую результат некоторого выражения, значение которого, как я знаю, не должно изменяться, в качестве верхней границы цикла for ?

  • Проверка границ при поиске в массиве. Устранит ли это инструментальная цепочка при определенных условиях, таких как архетипичный цикл for ?

  • Встраивание значений. Всегда ли будет встроен доступ к некоторому общедоступному статическому конечному int ? Даже если они из другого класса? Даже если они в другом пакете?

  • Прогноз перехода. Насколько это вообще большая проблема? Сильно ли снижает производительность типичного устройства Android при ветвлении?

  • Простая арифметика. Будет ли someInt * 2 заменен на someInt << 1 ?

И так далее ...

67
задан SyntaxT3rr0r 6 February 2011 в 13:36
поделиться