9

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);
}

基本的に、静的な反復回数 (8 回) を持つ上記のコードがあり、for ループをそのままにしておくとうまくいきません。しかし、ループを手動で展開すると、大幅に改善されます。JIT が実際にループをアンロールするかどうか、またそうでない場合はその理由を知りたいと思っています。

4

2 に答える 2

6

JVMが展開する場合、ループはおそらく、生成されたアセンブリを実際に印刷することによって最もよく答えられます。これには、コードを実際にホットスポットとして実行する必要があることに注意してください(つまり、JVMは、コストのかかる最適化に値すると見なします)。

JVMが何らかの方法で決定する理由は、はるかに難しい質問であり、おそらくJITコードの詳細な分析が必要です。

于 2011-08-30T12:38:49.577 に答える
1

ループ展開がループ内で実行されているかどうかを確認する別の方法は、コードを実行するときに JVM への引数-XX:LoopUnrollLimit=1として指定することです。

実行可能な jar がある場合、これを使用する方法の例は次のとおりです。

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

このフラグは

サーバー コンパイラの中間表現ノード数がこの値より少ないループ本体を展開します。

そして、生成されたアセンブリを見る必要なく、あなたの質問に直接対処します

于 2018-08-22T12:42:49.153 に答える