for,foreach和iterator之间的比较:为什么for在这种情况下比for-each更快?

时间:2014-05-06 12:54:14

标签: java performance for-loop foreach

我已阅读有关此问题的一些问题和答案,例如thisthisthis。他们中的大多数人都表示,每个人都不会慢于,而且在某些情况下会更快。

但我写了下面的代码,结果让我感到困惑。

  public ForWithArraylist() {
    // TODO Auto-generated constructor stub
    for (int i = 0; i < 1000000; i++) {
        number.add(i);
    }
    now = System.currentTimeMillis();
    second = 0;
    third = 0;
}
public void random() {
    for (int i = 0; i < number.size(); i++) {
        int j = number.get(i);
        //second = j;
    }
    second = System.currentTimeMillis();
    System.out.println(second - now);
}
public void it() {
    for (Iterator<Integer> iterator = number.iterator(); iterator.hasNext();) {
        int i = iterator.next();
        //third = i;
    }
    third = System.currentTimeMillis();
    System.out.println(third - second);
}
public void each() {
    for (Integer num : number) {
        int i = num;
    }
    System.out.println(System.currentTimeMillis() - third);
}

我在Windows上运行它( jdk 6 ),其中一个结果是:

(时间分别为,迭代器和for-each)。 平均,&#39;对于&#39;关于 25 ms的其他两个更快。

我在MacBook上运行它,其中一个结果是:

(时间分别为,迭代器和for-each)。 平均,&#39;对于&#39;与for-each相同甚至更慢,迭代器最慢。

所以有人可以向我解释一下吗?(ide,或操作系统,或其他)

编辑:感谢weston的提醒,我在另一个窗口( jdk 7 )上运行它,我和MacBook有类似的结果。

1 个答案:

答案 0 :(得分:3)

您不应该使用currentTimeMillies()来测量CPU执行时间,因为此方法具有意外延迟并且也不太准确。 你应该使用System.nanoTime(),因为首先,它是纳秒,其次,它的值更新更频繁。

此外,您不应该只运行一次此时间测量。 你应该做几次并计算平均值。操作系统还有其他业务需要处理,不是实时系统。

最后,你必须确保你在所有循环中做同样的事情。调用方法&#34;添加&#34;在数组列表上做的不仅仅是为数组中的位置赋值。