Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java for、foreach和iterator之间的比较:为什么在这种情况下for比for都快?_Java_Performance_For Loop_Foreach - Fatal编程技术网

Java for、foreach和iterator之间的比较:为什么在这种情况下for比for都快?

Java for、foreach和iterator之间的比较:为什么在这种情况下for比for都快?,java,performance,for-loop,foreach,Java,Performance,For Loop,Foreach,我读了一些关于这个问题的问题和答案,比如,和。他们中的大多数人说,对于每一种情况,它并不比for慢,在某些情况下甚至更快 但是我写了下面的代码,结果让我感到困惑 public ForWithArraylist() { // TODO Auto-generated constructor stub for (int i = 0; i < 1000000; i++) { number.add(i); } now = System.curren

我读了一些关于这个问题的问题和答案,比如,和。他们中的大多数人说,对于每一种情况,它并不比for慢,在某些情况下甚至更快

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

  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);
}
public for WithArrayList(){
//TODO自动生成的构造函数存根
对于(int i=0;i<1000000;i++){
编号。添加(i);
}
现在=System.currentTimeMillis();
秒=0;
第三=0;
}
公屋{
对于(int i=0;i
我在windows(jdk 6)上运行它,结果之一是:

(时间分别为、迭代器和)平均,“for”的速度比其他两个快约25ms

我在MacBook上运行它,结果之一是:

(时间分别为、迭代器和)平均而言,'for'与for-each相同,甚至更慢,迭代器速度最慢

有人能给我解释一下吗?(ide、操作系统或其他)


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

你不应该使用currentTimeMillies()来测量CPU执行时间,因为这种方法有意外的延迟,而且精度也不高。 您应该使用System.nanoTime(),因为首先,它以纳秒为单位,其次,它的值更新得更频繁

此外,您不应该只运行一次时间度量就得出任何结论。 你应该做几次,然后计算平均值。操作系统还有其他事务需要处理,它不是实时系统


最后,您必须确保在所有循环中执行完全相同的操作。在数组列表中调用“add”方法所做的工作远不止为数组中的某个位置赋值。

首先,您不能基于单个测试进行查找,但必须运行一整套测试。这样很可能会把你引入歧途。另外,谎言,该死的谎言和。如果你想要更明确的见解,你可能想要构造所有使用
整数的循环,然后检查byte code.JDK 1.6和JDK 1.7。我知道增强的for循环使用数组访问,但对于1.7.0版本的数组访问,它可能也使用数组访问