4

例えば:

for(int i = 0; i < 20 * 40 * 60 * 80; i++){ ... }

に比べ:

for(int i = 0; i < 3840000; i++){ ... }

最初のループは 2 番目のループよりもはるかに遅く実行されます (いくつかのタイム トライアルを行いました)。ただし、条件の値は反復中のどの段階でも変化しません。確かに、メソッドを使用すると、その値が変わる可能性があるため、これは異なります (おそらく変更すべきではありませんが)。なぜJavaがその値をキャッシュ/一時保存しないのか疑問に思っていました。

long fact10 = factorial(10);
for(long n = 0; n < fact10; n++)    vs   for(long n = 0; n < factorial(10); n++)
4

5 に答える 5

6

Java は 2 番目の最適化を行うことができません。これは、factorial副作用がないことを認識していないためです。最初のベンチマークに関する限り、これはある種の間違いであると確信しています。Java コンパイラはコンパイル時に定数式の結果を計算するため、最初の 2 つのループは同等です。

于 2012-08-03T02:55:07.260 に答える
0

私が小さなプログラムを書いたのであなたがループの中に持っているものとかかった時間は両方の場合でほとんど同じです。ですから、それは本当にあなたが最初と2番目のループの中に何を持っているかに依存します。

public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        int x = 0;
        for (int i = 0; i < 500000000 ; i++) {
            x++;
        }
        long endTime = System.currentTimeMillis();
        long totalTime1 = endTime - startTime;
        System.out.println("First time " + totalTime1);

        startTime = System.currentTimeMillis();
        int j = 0;
        for (int i = 0; i < 50 * 100 * 10 * 10000 ; i++) {
            j++;
        }
        endTime = System.currentTimeMillis();
        long totalTime2 = endTime - startTime;
        System.out.println("Second time " + totalTime2);


        System.out.println( "First Loop " + totalTime1 + " Second Loop " + totalTime2 );
}
于 2012-08-03T14:43:30.487 に答える
0

理論的には(私はこれでうまくいきませんでしたが)、ループ内の「<」ステートメントの結果を変更できます。

例えば:

int x = 1;

for(int i = 0; i < x * 2; i++)
{
  if(x < 10)
     x += i;
}

値に関係なく毎回計算を行う正確な理由はわかりませんが、変数が存在する場合、反復ごとに常に数学を再計算します。

于 2012-08-03T02:52:32.450 に答える
0

状態は都度確認するので大丈夫だと思います。したがって、次のようなものを実装できます。

        synchronized (veryBigList) {
            for (Iterator iter = veryBigList.iterator();iter.hasNext();) {
                Object o = iter.next();
                //Do something
            }
        }

リストの実装によっては、パフォーマンスが異なることに注意してください。と思います(今はわからない)

ArrayListは では非常に高速ですが、下にある配列を拡張する必要がある場合はsize()遅くなります。LinkedListは では遅いですが、 では非常に高速ですadd()size()add()

私はこの解決策を好みます:

    synchronized (veryBigList) {
        for (int i = 0, l = veryBigList.size(); i < l; i++) {
            //Do something
        }
    }
于 2012-08-03T06:28:47.197 に答える