31

次のコードがあるとします。何かを行うための for ループが 3 つあります。最も外側の for ループを while ループに変更すると、高速に実行されますか? ありがとう~~

int length = 200;
int test = 0;
int[] input = new int[10];

for(int i = 1; i <= length; i++) {
    for (int j = 0; j <=length - i; j++) {
        for (int k = 0; k < length - 1; k++) {
            test = test + input[j + k];
        }
    }
}
4

17 に答える 17

60

いいえ、ループの種類を変更しても問題ありません。

高速化できる唯一の方法は、ループのネストを減らし、ループする値を減らすことです。

forループとループの唯一の違いは、whileそれらを定義するための構文です。性能差は全くありません。

int i = 0;
while (i < 20){
    // do stuff
    i++;
}

以下と同じです:

for (int i = 0; i < 20; i++){
    // do Stuff
}

(実際には for ループの方が少し優れています。これは、がiループの後にスコープ外になるためです。iwhile

for ループは、構文的にきれいなループ方法です。

于 2009-07-22T13:58:11.143 に答える
11

while誰かが対ルー​​プをテストすることを提案したforので、while ループまたは for ループがより高速であるかどうかをテストするコードをいくつか作成しました。平均して、100,000 回以上のテストで、whileループは約 95% 高速でした。私はそれを間違ってコーディングした可能性があります。私はコーディングにまったく慣れていません。また、10,000回のループしか実行しなかった場合、実行時間は非常に均一になることも考慮しています。

編集さらに試行をテストするために行ったときに、すべての配列値をシフトしませんでした。実行するトライアルの数を簡単に変更できるように修正しました。

import java.util.Arrays;

class WhilevsForLoops {

 public static void main(String[] args) {

final int trials = 100; //change number of trials
final int trialsrun = trials - 1;

boolean[] fscount = new boolean[trials]; //faster / slower boolean
int p = 0; // while counter variable for for/while timers



while (p <= trialsrun) {
     long[] forloop = new long[trials];
     long[] whileloop = new long[trials];

     long systimeaverage; 
     long systimenow = System.nanoTime();
     long systimethen = System.nanoTime();

     System.out.println("For loop time array : ");
     for (int counter=0;counter <= trialsrun; counter++) {
         systimenow = System.nanoTime();
         System.out.print(" #" + counter + " @");
         systimethen = System.nanoTime();
         systimeaverage = (systimethen - systimenow);
         System.out.print( systimeaverage + "ns |");

         forloop[counter] = systimeaverage; 
     }

     int count = 0;
     System.out.println(" ");
     System.out.println("While loop time array: ");
     while (count <= trialsrun) {
         systimenow = System.nanoTime();
         System.out.print(" #" + count + " @");
         systimethen = System.nanoTime();
         systimeaverage = (systimethen - systimenow);
         System.out.print( systimeaverage + "ns |");

         whileloop[count] = systimeaverage;
         count++;
     }


     System.out.println("===============================================");
     int sum = 0;

     for (int i = 0; i <= trialsrun; i++) {
        sum += forloop[i];
     }

     System.out.println("for loop time average: " + (sum / trials) + "ns");

     int sum1 = 0;

     for (int i = 0; i <= trialsrun; i++) {
         sum1 += whileloop[i];
     }
     System.out.println("while loop time average: " + (sum1 / trials) + "ns");



     int longer = 0;
     int shorter = 0;
     int gap = 0;

     sum = sum / trials;
     sum1 = sum1 / trials; 

     if (sum1 > sum) {
        longer = sum1;
        shorter = sum;
     }
     else {
        longer = sum;
        shorter = sum1;
     }

     String longa;

     if (sum1 > sum) {
        longa = "~while loop~";
     }
     else {
         longa = "~for loop~";
     }

     gap = longer - shorter; 
     System.out.println("The " + longa + " is the slower loop by: " + gap + "ns");
     if (sum1 > sum) {
     fscount[p] = true; }
     else {
         fscount[p] = false;
     }
     p++;
}

    int forloopfc=0;
    int whileloopfc=0;

    System.out.println(Arrays.toString(fscount));

    for(int k=0; k <= trialsrun; k++) {
        if (fscount[k] == true) {
            forloopfc++; }
            else {
                whileloopfc++;}

    }

    System.out.println("--------------------------------------------------");

    System.out.println("The FOR loop was faster: " + forloopfc + " times.");
    System.out.println("The WHILE loop was faster: " + whileloopfc + " times.");
 }

}
于 2012-11-26T07:50:21.207 に答える
10

while に変更して最適化することはできません。

ラインを変更することで、速度を非常に非常にわずかに上げることができます

for (int k = 0; k < length - 1; k++) {

for (int k = 0; k < lengthMinusOne; k++) {

lengthMinusOne が前に計算される場所

この減算は、ほぼ (200x201/2) x (200-1) 回計算されているだけで、コンピューターにとっては非常に少ない数値です:)

于 2009-07-22T14:05:58.653 に答える
4

これは、この問題に関する記事への役立つリンクです

それによると、While と For はほぼ 2 倍高速ですが、どちらも同じです。

しかし、この記事は2009年に書かれたものなので、自分のマシンで試してみた結果は次のとおりです。

  • Java 1.7 を使用: Iterator は For および While よりも約 20% ~ 30% 高速でした (どちらも同じでした)。
  • Java 1.6 を使用: Iterator は For および While よりも約 5% 高速でした (どちらも同じでした)。

ですから、自分のバージョンとマシンで時間を計って、それから結論を出すのが最善だと思います

于 2012-04-18T12:38:08.827 に答える
1

パフォーマンスの違いはありません。やってみよう!

JVMとさらにはコンパイラーは、両方のループを次のようなものにします。

    label:
       ;code inside your for loop.
    LOOP label
于 2011-12-16T18:53:48.727 に答える
1

あなたのアルゴリズムを見てください!配列のどの値が複数回追加されるかを事前に知っていますか?

ループの数を減らすことができ、それによってパフォーマンスが向上することがわかっている場合。

于 2009-07-22T14:05:18.483 に答える
1

誰かがこのように試しましたか...

int i = 20;
while (--i > -1){
    // do stuff
}

に比べ:

for (int i = 0; i < 20; i++){
    // do Stuff
}
于 2016-07-07T09:34:32.330 に答える
1

いいえ、あなたはまだまったく同じ回数ループしています。まったく問題ありません。

于 2009-07-22T13:59:22.610 に答える
0

WhileループとForループは同じ

http://www.mkyong.com/java/while-loop-for-loop-and-iterator-performance-test-java/

于 2016-07-22T10:20:06.207 に答える
0

マルチスレッドまたはマルチプロセッサプログラミングを使用している場合にのみ問題になります。次に、ループをさまざまなプロセッサ/スレッドに割り当てる方法にも依存します。

于 2009-07-22T14:02:53.510 に答える