2017-08-21 5 views
7

ホットスポットのJITの理由について私は考えています。私は主に最新のコンパイル段階(C2コンパイラ)に興味があります。 JavaのJITは最適化のアサーションに依存していますか?その場合、コードを実行できる例があると想像できます。アサーションを有効にしてを高速に実行します。例えばJava、アサーション、JIT

、このようなコードの断片で:

static int getSumOfFirstThree(int[] array) { 
    assert(array.length >= 3); 
    return array[0] + array[1] + array[2]; 
} 
  • アサーションが有効になっているJITは、アクセスアレイ上境界チェックを排除するのに十分賢いだろうか?
  • また、JITがコンパイルするネイティブコードをアサーションが実際にどのように改善するかについて(実用的なのかそうでないのか)考えることができる場合がありますか?

答えて

3

この場合、複数の境界チェックが行われ、1つのチェックのみが行われるようにJITが結合することは可能ですが、アサーションはチェックを行う必要はありません。

アサーションは、メソッドがより大きく、サイズがメソッドをインライン化するかどうかを決定する要因であるため、インライン化のような最適化を防止します。通常、インライン化はパフォーマンスを向上させますが、大規模なコードが生成されるためL0またはL1 CPUキャッシュが非効率になる可能性があるため、パフォーマンスが向上しない場合があります。

アサーションがパフォーマンスを向上させることができる例は、このようなものです。

boolean assertionOn = false; 
assert assertionOn = true; 
if (assertionOn) { 
    assumeDataIsGood(); // due to checks elsewhere 
} else { 
    expensiveCheckThatDataMightNotBeGood(); 
} 

これはおそらくアサーションを使用するための反パターンですが、アサーションを意図して安価になる予定です。

関連する問題