Быстрый вопрос по оптимизации Java - PullRequest
9 голосов
/ 04 октября 2009

Будет ли компилятор Eclipse автоматически преобразовывать умножение на степень два в сдвиг в битах, или я должен делать это вручную? Спасибо за помощь.

Ответы [ 3 ]

33 голосов
/ 04 октября 2009

Краткий ответ: Нет. Компилятор исходного кода не заменит умножение на два с битовым сдвигом.

Длинный ответ: Нет, потому что он не может знать, быстрее ли сдвиг бит, чем умножение на платформе, в которой в конечном итоге будет выполняться код. Таким образом, вопрос должен заключаться в том, что конкретная виртуальная машина заменит умножение битовым сдвигом, и это, вероятно, произойдет. Я немного поэкспериментировал с этим, чтобы оптимизировать блок кода, и интересно, что горячая точка Sun демонстрирует здесь другое поведение, в зависимости от того, работает программа на AMD или на процессоре Intel (по крайней мере, с тестированными процессорами). В любом случае умножение со степенью двойки заменяется битовым сдвигом, но для умножения со степенью двух +/- 1 (3, 5, 7, 9, 15, 17, ...) Hotspot будет генерировать сдвиг битов и сложение или вычитание для процессоров Intel, одновременно генерируя умножение для процессоров AMD, поскольку процессор AMD выполняет умножение намного быстрее, чем процессор Intel. Конечно, возможно, что это поведение отличается в разных моделях процессоров от каждого поставщика.

Если вам интересно узнать, что на самом деле делает виртуальная машина, весьма полезно получить отладочную сборку jdk7 и включить дампы кода ассемблера, сгенерированного компилятором Hotspot.

10 голосов
/ 04 октября 2009

Не пытайтесь угадать современный java-компилятор, если вы точно не знаете, что делаете. Это относится не только к простой математике, такой как вопрос, но и ко всему. Например: как управление потоком.

Люди, умнее, чем мы, приложили немало усилий, чтобы сделать все это очень быстро.

4 голосов
/ 04 октября 2009

Как правило, вы не можете перехитрить JVM, если не существует чего-то очень высокого уровня , которого вы знаете, что не может быть выведено автоматически. Обычно это означает, что доступен лучший алгоритм, чем тот, который используется в настоящее время, вместо ручной настройки вашего источника. Вы можете использовать профилировщик jvisualvm, доступный в последней версии Java 6 JDK, чтобы исследовать вашу программу и увидеть узкие места.

Например, затраты на создание новых объектов вместо повторного использования старых радикально уменьшились по сравнению с последними 10 годами, поэтому вам не следует принимать какие-либо старые рекомендации по настройке Java-программы, не проверяя, сохраняется ли она.

Тем не менее, вы обнаружите, что поддержание вашей программы простым и, прежде всего, читабельным, значительно упростит поддержку как для вас, так и для будущих программистов. Любая ненужная сложность будет сбивать с толку ваших будущих читателей, и вам нужно будет сказать в комментарии, почему она ДОЛЖНА быть такой (иначе они просто вернут ее в исходный вид:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...