11

Javaで何が速いか。配列インデックスに直接複数回アクセスするか、配列インデックスの値を新しい変数に保存して、これを次の計算に使用しますか?

アクセスインデックス

if ((shape.vertices[0].x >= fromX && shape.vertices[0].x <= toX) || // left side of shape in screen
    (shape.vertices[0].x <= fromX && shape.vertices[0].x + shape.width >= fromX) || // right side of shape in screen
    (shape.vertices[0].x >= fromX && shape.vertices[0].x + shape.width <= toX)) { // shape fully in screen

    // ...
}

一時変数

float x = shape.vertices[0].x;
float y = shape.vertices[0].y;
if ((x >= fromX && x <= toX) || // left side of shape in screen
    (x <= fromX && x + shape.width >= fromX) || // right side of shape in screen
    (x >= fromX && x + shape.width <= toX)) { // shape fully in screen

        // ...
    }
4

6 に答える 6

7

2番目のアプローチは間違いなく高速です。finalしかし、あなたはキーワードでさらに助けることができます:

final float x = shape.vertices[0].x;
final float y = shape.vertices[0].y;
final int rightEdge = x + shape.width;
if ((x >= fromX && x <= toX) || // left side of shape in screen
(x <= fromX && rightEdge >= fromX) || // right side of shape in screen
(x >= fromX && rightEdge <= toX)) { // shape fully in screen

    // ...
}

もちろん、重要な改善ではありません(ただし、それでも改善であり、意図も明確になります)。あなたはこの議論を読むことができます:http://old.nabble.com/Making-copy-of-a-reference-to-ReentrantLock-tt30730392.html#a30733348

于 2012-04-19T15:35:11.857 に答える
2

長期的には、jvmは配列要素にアクセスするときにオフセットを計算する必要があるため、一時配列の宣言はより高速になります。

プロファイリングツールを使用して、どちらがより迅速に使用できるかを確認しますが、非常に時間に敏感な非常に集中的な作業を行わない限り、これは大きな改善にはならないことに注意してください。

于 2012-04-19T15:39:10.173 に答える
1

プロファイラーを介してコードを実行し、ユースケースの質問に答えます。

これに対する答えは、おそらくJVM固有です。Oracle HotSpot JVMは、OpenJDKまたはIBMのJDKとは異なるパフォーマンスを発揮します。タイミングは、JVMがバイトコードを最適化する方法、実行中にコンパイルすることを決定する内容によって異なります。サーバーモードとクライアントモードもおそらく違いを生むでしょう。

読みやすさを目指しましょう。コードのそのセクションが問題であるとプロファイリングおよび決定した後、最適化します。

于 2012-04-19T15:58:05.943 に答える
0

2番目のアプローチは高速ですが、より多くのメモリを消費します。ただし、アレイのサイズが大きくない限り、パフォーマンスの向上はわずかナノ秒です。

于 2012-04-19T15:37:46.313 に答える
-1

2番目のアプローチをお勧めします。これは、読みやすく、保守性に非常に役立つからです。

アレイが巨大な場合を除いて、パフォーマンスの向上は非常に小さいものです。

一方、読みやすさの向上は、常に取るのに適しています。

于 2012-04-19T15:37:11.140 に答える
-1

アレイアクセスはより高速になる可能性があります。次のプログラムに注意してください。

public class ArraySpeedTest{

public static void main(String [] args){

    float x = 4.4f;
    float [] xArr = new float[1];
    xArr[0] = 4.4f;

    long time1 = System.nanoTime();
    for(int i = 0 ; i < 1000*1000*1000; i++){
        if(x > 1 && x < 5){

        }
    }
    long time2 = System.nanoTime();

    System.out.println(time2-time1);

    long time3 = System.nanoTime();
    for(int i = 0 ; i < 1000*1000*1000; i++){
        if(xArr[0] > 1 && xArr[0] < 5){
        }
    }
    long time4 = System.nanoTime();

    System.out.println(time4-time3);


}

}

出力::52902892130667

JVMの実装、フラグ、およびプログラムの順序によって、パフォーマンスが数ミリ秒程度変化する可能性があります。

于 2012-04-19T15:48:25.640 に答える