2012-07-02 3 views
3

Можно создать дубликат:
Are there inline functions in java?"Встраивание" в Java

Я родом из C++, где я хотел бы написать

for (int i = 0; i < numNonZero(); ++i) 

зная, что numNonZero(), будучи очень маленький и «inline» просто исчезнут из скомпилированного кода. Как насчет Java? Должен ли я вместо этого использовать int _numNonZero в своем классе и написать

for (int i = 0; i < _numNonZero; ++i) 

для максимальной скорости?

+1

Что означает «будучи очень маленьким и« встроенным », просто исчезнет из скомпилированного кода.»? Выйдите туда, где? – Coffee

+0

Вы спрашиваете, будет ли компилятор оптимизировать вызов метода? Ответ на это нет, как в javac, так и в gcc. – lynks

+3

Как и http://stackoverflow.com/q/2096361/484072 – peacemaker

ответ

10

Сфокусируйте внимание на написании наиболее читаемого кода и дайте HotSpot Java virtual machine оптимизировать его во время выполнения.

7

Это не имеет значения. Java-код преобразуется в исполняемый код во время выполнения виртуальной машиной Java. Точка доступа или другие современные jvms имеют очень продвинутые возможности. Для максимальной производительности я могу порекомендовать вам использовать флаг -server, который будет выполнять агрессивные оптимизации.

+2

Да. Задача JIT - решить, где такие вещи могут быть встроены, а не программисты. –

+1

JIT не всегда понимает это правильно. Я только что обнаружил, что не будет встроенных методов более чем 35 байт-кодов. Вручая это для одного метода в одном цикле, я только что сэкономил мне 15% процессорного времени. Я с нетерпением жду того дня, когда JIT бы поняла, что :) –

5

Как и другие, вы должны беспокоиться в первую очередь о читаемом коде. Однако, чтобы ответить на ваш вопрос, хотя компилятор javac не встраивает, Hotspot - оптимизатор JVM - will inline it for you, если он может.

+0

+1 для лучшей ссылки, хотя мой предлагает утешение отметить, что HotSpot написан на C++. :-) – trashgod

+1

Ну, на днях я работал с «Итератором» на Java, и получил 5-кратное ускорение, заменив их на ints. Я теперь подозрительно отношусь к возможностям Java ... – Frank

+0

@Frank JIT движется таинственными способами. ;) –

2

Рекомендуется Джошуа Блох в течение (;;) {}:

for (int i = 0, n = numNonZero() ; i < n; ++i) { .. 

Если numNonZero() изменение (и вернуть string.length(), или сделал некоторые вычисления), то код остается правильным ,

3

javac практически не оптимизирует. Вместо этого оптимизация выполняется во время выполнения. Вы можете видеть, был ли метод встроен во время выполнения с -XX:+PrintCompilation

+1

Вывод вывода '-XX: + PrintCompilation' не очень хорошо документирован.Я нашел эту статью [About PrintCompilation] (https://gist.github.com/1165804#file_notes.md) очень полезной. –

Смежные вопросы