Политика развертывания Java JIT loop?
какова политика развертывания цикла для 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 ответов
Если JVM разворачивает цикл, вероятно, лучше всего ответить на самом деле печать сгенерированной сборки. Обратите внимание, что это требует, чтобы ваш код фактически выполнялся как горячая точка (т. е. JVM считает его достойным дорогостоящих оптимизаций).
почему JVM решает так или иначе, это гораздо более сложный вопрос и, вероятно, требует углубленного анализа кода JIT.
другой способ увидеть, выполняется ли развертывание цикла в цикле, - указать -XX:LoopUnrollLimit=1
как аргумент для JVM при выполнении кода.
Если у вас есть исполняемый jar, то пример, как можно использовать это:
java -XX:LoopUnrollLimit=1 -jar your-jar.jar
этот флаг будет
развернуть тела цикла с сервером компилятора промежуточного представления узла подсчета меньше, чем это значение
и это сразу адресует ваше вопрос без необходимости смотреть на сгенерированную сборку