Java for循环与while循环。性能差异?

时间:2009-07-22 13:56:58

标签: java for-loop while-loop

假设我有以下代码,有三个for循环来做某事。如果我将最外部的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];
        }
    }
}

16 个答案:

答案 0 :(得分:54)

不,改变循环的类型并不重要。

唯一可以使其更快的方法是减少循环嵌套,并循环使用较少的值。

for循环和while循环之间的唯一区别是定义它们的语法。根本没有性能差异。

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

与:

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

(实际上for循环更好一点,因为i将在循环后超出范围,而i将在while循环案例中保持不变。)< / p>

for循环只是一种语法更漂亮的循环方式。

答案 1 :(得分:31)

这种微观优化毫无意义。

  • while循环不会更快。
  • 循环结构是你的瓶颈。
  • 首先优化算法。
  • 更好的是,不要先优化。只有在您发现算法确实存在非I / O依赖的瓶颈后才进行优化。

答案 2 :(得分:10)

你不能通过改变它来优化它。

你可以通过改变线

来非常非常地增加速度
for (int k = 0; k < length - 1; k++) {

通过

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

其中lengthMinusOne是在

之前计算的

这个减法只是计算几乎(200x201 / 2)x(200-1)次,这对于计算机而言是非常少的数字:)

答案 3 :(得分:7)

有人建议测试while vs 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.");
 }

}

答案 4 :(得分:2)

即使while循环的假设比for循环更快是真的(并且它不是),你必须改变/优化的循环不是外部的循环而是内部的循环,因为它们是执行次数更多。

答案 5 :(得分:2)

for和while之间的差异是语义

  • 在while循环中,只要条件为真,就会循环,这可能会有很大变化,因为在循环中,您可能会在使用while条件时修改变量。
  • 通常,在for循环中,循环N次。这个N可以是变量,但是在N循环结束之前不会移动,因为通常开发人员不会修改在循环条件中计算的变量。

这是一种帮助其他人理解您的代码的方法。您没有义务不修改循环变量,但这是一种常见的(也是很好的)实践。

答案 6 :(得分:2)

这是一篇关于此事的文章的有用link

根据它,While和For的速度几乎快两倍,但两者都相同。

但是这篇文章是在2009年写的,所以我在我的机器上试了一下,结果如下:

  • 使用java 1.7:Iterator比For和While快20%-30%(仍然是相同的)
  • 使用java 1.6:Iterator比For和While快5%(仍然是相同的)

所以我想最好的事情就是把它放在你自己的版本和机器上,然后从那里得出结论

答案 7 :(得分:1)

不,你还在循环完全相同的次数。没关系。

答案 8 :(得分:1)

看看你的算法!您是否事先知道阵列中的哪些值被添加了多次?

如果您知道可以减少循环次数,那么可以提高性能。

答案 9 :(得分:0)

只有使用多线程或多处理器编程才有意义。那么它还取决于你如何将循环分配给各种处理器/线程。

答案 10 :(得分:0)

没有性能差异。试试吧!

JVM以及编译器将使两个循环成为类似

的循环
    label:
       ;code inside your for loop.
    LOOP label

答案 11 :(得分:0)

有没有人这样试过......

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

与:相比:

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

答案 12 :(得分:0)

答案 13 :(得分:0)

不,不会有什么大不同,唯一的是,如果嵌套循环可能需要考虑切换(例如出于组织目的),则可能需要在外部使用while循环并使用for语句在里面。这不会影响性能,但是只会使您的代码看起来更整洁/有条理

答案 14 :(得分:0)

您可以自己计算。

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

long startTime = new Date().getTime();

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];
        }
    }
}

long endTime = new Date().getTime();
long difference = endTime - startTime;
System.out.println("For - Elapsed time in milliseconds: " + difference);


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

int i = 0, j = 0, k = 0;

startTime = new Date().getTime();

while(i < length) {
    while(j <= length - i ) {
        while(k < length - 1) {
            test = test + input[j + k];
            k++;
        }
        j++;
    }
    i++;
}

endTime = new Date().getTime();
difference = endTime - startTime;
System.out.println("While - Elapsed time in milliseconds: " + difference);

答案 15 :(得分:-1)

基于此:https://jsperf.com/loops-analyze(不是由我创建的)while循环通常比for循环慢22%。至少在Javascript中是。