Javaは、配列要素のアクセスごとに、インデックスが範囲外でないかどうかを確認します。しかし、Scalaのマップ関数のようないくつかのケースでは、コンパイラ/ライブラリは独自のインデックスを扱うため、範囲外のアクセスは保証されません。Java/Scalaで境界チェックを無効にすることはできますか?
パフォーマンス上の理由から、コードの一部のJVMでこのような境界チェックを無効にすることはできますか?
Javaは、配列要素のアクセスごとに、インデックスが範囲外でないかどうかを確認します。しかし、Scalaのマップ関数のようないくつかのケースでは、コンパイラ/ライブラリは独自のインデックスを扱うため、範囲外のアクセスは保証されません。Java/Scalaで境界チェックを無効にすることはできますか?
パフォーマンス上の理由から、コードの一部のJVMでこのような境界チェックを無効にすることはできますか?
いいえ、配列範囲のチェックを無効にすることはできません。それはJVMが危険にさらされることになります。
ただし、JITコンパイラでは、特定の範囲チェックが不要であると推測し、最適化しない場合があります。
また、JITコンパイラは特定の組み込み型の「巧妙なこと」を行う可能性があります。ネイティブコードで物を実装することで問題を解決することができますが、ネイティブコールを作成するオーバーヘッドがネイティブ計算の節約に拍車をかけていることがわかります。
あなたは多分JITはチェックが必要とされてとどまるところを推測ないだろういくつかのサンプルコードを示しすることはできますか?
:いくつかは全く配列の境界チェックはここでは必要ないことを推測理論で、私はしかし:-)public int sum(int[] array) { int sum = 0; for (int i = 0; i < array.length; i++) { sum += array[i]; } return sum; }
に喜ん以上の時間、JITコンパイラをでき費やすことなく
ありません
この場合、単純な穴の最適化は、ループ本体の2番目の境界チェックを削除する必要があります。
public int sum2(int[] array) {
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
sum += array[i];
}
return sum;
}
JITが境界チェックを必要としていないと想定して、サンプルコードを表示できますか? – pythonic
境界チェックは、大幅に最適化されているため、実際のパフォーマンスのボトルネックとなることはめったにありません(最小限ループブースト)。実際にそうであることを確認するために命令レベルプロファイリングを行った場合は、チェックをバイパスするために 'Unsafe'を使用することを検討できます。しかし、私の知る限り、JDKクラスのなかでは何もしませんが、サードパーティ製の高性能ライブラリはほんのわずかです。 – the8472