我在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
现在,为什么会这样。
答案 0 :(得分:6)
您可以根据
计算时间fl = stop-start/2;
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百万分之一秒内完成。