2012-04-22 2 views
1

Я конвертирую код C++ в Java, и мне было интересно, что я могу сделать с встроенными функциями. Могу ли я предположить, что функции будут встроены в VM (по мере необходимости) и просто не беспокойтесь об этом? Как профилировать это поведение? Предположим, что есть основная внешняя функция, и я бросаю цикл for вокруг него и вызывая миллион вызовов. Должен ли я ожидать улучшения, когда виртуальная машина становится все больше и больше?Будет ли встроена встроенная встроенная функция Hotspot VM?

ответ

4

Да Java выполняет встроенные вызовы методов. Встраивание выполняется компилятором JIT, поэтому вы не увидите его, изучив файлы байт-кода.

Независимо от того, происходит ли наложение фактического значения для данного вызова метода, будет зависеть от размера тела метода и зависит ли вызов. (Если вызов метода включает отправку ... после того, как JVM имеет кучу глобальной оптимизации, предназначенной для удаления ненужной диспетчеризации ... тогда она не может быть встроена.)

То же самое относится к вашему примеру с внешней внешней функцией. Это зависит от того, насколько велик тело метода. С другой стороны, если метод занимает значительное время для выполнения, то относительная важность оптимизации уменьшается соответственно.


Мой совет: не волноваться о таких вещах на данном этапе. Просто напишите код четко и просто, и пусть компилятор JIT справится с проблемой оптимизации. Когда ваше приложение работает, вы можете просмотреть его и посмотреть, есть ли в коде какие-либо «горячие точки», которые стоит оптимизировать вручную.


Но я должен быть в состоянии видеть это в чем-то вроде визуальной права VM? Я имею в виду, что изначально нет вставки, тогда все больше и больше материала встраивается, поэтому среднее время для внешнего метода немного уменьшается.

Это может быть наблюдаемо, и это может быть не так, в зависимости от количества времени, затраченного на выполнение вызовов относительно выполнения тел метода. (Профилирование часто зависит от выборки счетчика программ. Сообщенные моменты могут быть неточными, если количество выборок для данного региона кода слишком мало ... и по другим причинам.)

Это также зависит от JVM, которую вы используются. Не все JVM будут повторно оптимизировать код, который они ранее оптимизировали.

Наконец, есть способ заставить JVM сбрасывать исходный код с помощью JIT-компилятора. Это даст вам окончательный ответ на то, что было вложено ... если вы готовы прочитать машинные инструкции.

+0

Но я должен уметь видеть это в чем-то вроде Visual VM? Я имею в виду, что изначально нет вставки, тогда все больше и больше материала встраивается, поэтому среднее время для внешнего метода немного уменьшается. – Nikhil