为什么第二个循环比第一个循环快。
public class Test2 {
public static void main(String s[]) {
long start, end;
int[] a = new int[2500000];
int length = a.length;
start = System.nanoTime();
for (int i = 0; i < length; i++) {
a[i] += i;
}
end = System.nanoTime();
System.out.println(end - start + " nano with i < a.length ");
int[] b = new int[2500000];
start = System.nanoTime();
for (int i = b.length - 1; i >= 0; i--) {
b[i] += i;
}
end = System.nanoTime();
System.out.println(end - start + " nano with i > = 0");
}
}
输出
6776766 nano with i < a.length
5525033 nano with i > = 0
更新 - 我已根据建议更新了问题,但我仍然看到时间上的差异。第一个循环比第二个循环花费更多时间。
答案 0 :(得分:3)
很可能是因为你在第一种情况下每次迭代都会获取a.length的值,与第二种情况下的一次相反。
尝试做类似
的事情int len = a.length;
并使用len作为循环的终止边界。
这可能会减少第一次循环的时间。
答案 1 :(得分:2)
如果我稍微修改了你的第一个for循环,你会得到类似的时间:
int alength = a.length; // pre-compute a.length
start = System.currentTimeMillis();
for (int i = 0; i < alength; i++) {
a[i] += i;
}
$ java Test
8 millis with i<a.length
6 millis with i>=0
答案 2 :(得分:1)
时间差异的主要原因是 -
&#34; ...永远不要使用
System.currentTimeMillis()
,除非您的准确度为+或 - 15 ms,这在大多数OS + JVM组合中都是典型的。请改用System.nanoTime()
。&#34; - Scott Carey Found Here
<强>更新强>
我相信在你的问题的评论部分提到你应该在测试微基准测试之前预热你的测试内核。
规则1:始终包括一个预热阶段,它一直运行测试内核,足以在定时阶段之前触发所有初始化和编译。 (在预热阶段,迭代次数较少。经验法则是数万次内循环迭代。)