Политика развертывания цикла Java JIT? - PullRequest
7 голосов
/ 30 августа 2011

Какова политика развертывания цикла для JIT?Или, если нет простого ответа на этот вопрос, то есть ли какой-нибудь способ, которым я могу проверить, где / когда в цикле выполняется развертывание цикла?

GNode child = null;
for(int i=0;i<8;i++){
   child = octree.getNeighbor(nn, i, MethodFlag.NONE);
   if(child==null)
      break;
   RecurseForce(leaf, child, dsq, epssq);
}

По сути, у меня есть фрагмент кода, который имеет статическое число итераций (восемь), и это плохо, когда я оставляю цикл for как есть.Но когда я вручную раскручиваю цикл, это значительно лучше.Мне интересно узнать, действительно ли JIT развернул цикл, а если нет, то почему.

Ответы [ 2 ]

6 голосов
/ 30 августа 2011

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

Почему JVM так или иначе решаетболее сложный вопрос и, вероятно, требует углубленного анализа кода JIT.

0 голосов
/ 22 августа 2018

Другой способ проверить, выполняется ли в цикле развертывание цикла, - указать -XX:LoopUnrollLimit=1 в качестве аргумента для JVM при запуске кода.

Если у вас есть исполняемый файлjar, затем пример того, как вы можете использовать это:

java -XX:LoopUnrollLimit=1 -jar your-jar.jar

Этот флаг будет

Развернуть тела цикла с числом промежуточных узлов представления компилятора сервера меньше, чем это значение

И это напрямую решит ваш вопрос без необходимости смотреть на сгенерированную сборку

...