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



我用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

现在,为什么会发生这种情况。

您根据计算时间

fl = stop-start/2;

由于操作员优先级:

fl = stop - (start / 2)

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

小的差异实际上可以忽略不计,而且很难确定是什么原因造成的。两个循环的字节码是相同的:

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

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

任何事情都可能导致差异,从操作系统处理另一个进程的线程,到防病毒病毒踢它,再到宇宙射线造成干扰。这就像在问为什么A车在1小时内完成一条路线,而另一辆车在1时100万分之一秒内完成。

最新更新