在这段代码中,为什么第二个循环的执行速度比第一个循环慢?

时间:2013-08-25 15:15:46

标签: java loops for-loop while-loop execution-time

我在Java中使用了两种不同类型的循环代码。

public class Test {
    public static void main(String[] args){
        long fl = 0, wl = 0; 
        int i = 0;
        int a = 0;
        long start = 0, stop = 0;

        start = System.currentTimeMillis();
        while(i<2000000000){
             if(i%2 == 0)
                a++;
            else
                a--;
            i++;
        }
        stop = System.currentTimeMillis();
        wl = stop-start/2;
        System.out.println("\nWhile loop = "+wl);

        i = 0;
        a = 0;
        start = 0;
        stop = 0;

        start = System.currentTimeMillis();
        for(;i<2000000000;){
            if(i%2 == 0)
                a++;
            else
                a--;
            i++;
        }
        stop = System.currentTimeMillis();
        fl = stop-start/2;
        System.out.println("For loop = "+fl);

        System.out.println("Difference = "+(fl-wl));
    }
}

现在,在多次运行程序之后,我得出的结论是第二个循环总是比第一个循环执行得慢。起初,我认为它与一个for循环而另一个是while循环有关,但即使我颠倒顺序,第二个循环仍然执行得更慢。以下是样本运行的输出。

While loop = 688721817947
For loop = 688721824295
Difference = 6348

现在,为什么会这样。

3 个答案:

答案 0 :(得分:6)

您可以根据

计算时间
fl = stop-start/2;

归因于operator precedence

fl = stop - (start / 2)

这不是你想要的,因为100 ms后执行它会导致fl变量长50ms((stop + 100) - ((start + 100) / 2) = stop - (start / 2) + 50)。这可能是为什么第二个总是“慢”的原因。

答案 1 :(得分:1)

的差异实际上可以忽略不计,并且很难确定导致它的原因。两个循环的字节码是相同的:

<强> while - 环

  21: goto          43
  24: iload         5
  26: iconst_2      
  27: irem          
  28: ifne          37
  31: iinc          6, 1
  34: goto          40
  37: iinc          6, -1
  40: iinc          5, 1
  43: iload         5
  45: ldc           #22                 // int 2000000000
  47: if_icmplt     24

<强> for - 环

 104: goto          126
 107: iload         5
 109: iconst_2      
 110: irem          
 111: ifne          120
 114: iinc          6, 1
 117: goto          123
 120: iinc          6, -1
 123: iinc          5, 1
 126: iload         5
 128: ldc           #22                 // int 2000000000
 130: if_icmplt     107

答案 2 :(得分:0)

这种差异毫无意义,如6348 / 688721824295 aprox 9-E9。也就是说,不到1-E6%。

任何事情都可能导致差异,从操作系统处理来自另一个进程的线程或杀死它的反病毒或导致干扰的宇宙射线。这就像问为什么A车在1小时内完成路线而另一辆在1小时和1百万分之一秒内完成。