Java 据说枚举比迭代器快一点,为什么?

Java 据说枚举比迭代器快一点,为什么?,java,collections,iterator,enumeration,Java,Collections,Iterator,Enumeration,为什么枚举比迭代器快?尽管迭代器比枚举更具优势。值得注意的是,枚举仅在较旧的线程安全集合上可用。可以在任何集合上使用迭代器,因为它不必是线程安全的,所以没有额外的锁定开销 public static void main(String... args) { Vector<Integer> vec = new Vector<>(); ArrayList<Integer> al = new ArrayList<>(); polul

为什么枚举比迭代器快?尽管迭代器比枚举更具优势。

值得注意的是,枚举仅在较旧的线程安全集合上可用。可以在任何集合上使用迭代器,因为它不必是线程安全的,所以没有额外的锁定开销

public static void main(String... args) {
    Vector<Integer> vec = new Vector<>();
    ArrayList<Integer> al = new ArrayList<>();
    polulate(vec);
    polulate(al);
    for (int i = 0; i < 5; i++) {
        long start = System.nanoTime();
        long sum1 = enumSumOf(vec);
        long mid1 = System.nanoTime();
        long sum1b = iterSumOf(vec);
        long mid2 = System.nanoTime();
        long sum2 = iterSumOf(al);
        long end = System.nanoTime();
        System.out.printf("Each iteration of Enumeration took %,d ns (Vector), Iteration took %,d ns (Vector), Iteration took %,d ns (ArrayList)%n",
                (mid1 - start) / vec.size(), (mid2 - mid1) / vec.size(), (end - mid2) / al.size());
    }
}

private static long enumSumOf(Vector<Integer> vec) {
    long sum = 0;
    for (Enumeration<Integer> e = vec.elements(); e.hasMoreElements(); )
        sum += e.nextElement();
    return sum;
}

private static long iterSumOf(Vector<Integer> al) {
    long sum = 0;
    for (int i : al)
        sum += i;
    return sum;
}

private static long iterSumOf(ArrayList<Integer> al) {
    long sum = 0;
    for (int i : al)
        sum += i;
    return sum;
}

private static void polulate(List<Integer> l) {
    for (int i = 0; i < 1000000; i++)
        l.add(i);
}

在给出的微基准测试示例中,枚举比迭代器快的原因是它首先被测试

较长的答案是,当循环迭代10000次时,热点编译器会优化整个方法。当您有两个循环时,您可以使用
-XX:CompileThreshold=NNNN
更改此设置,方法与您可以看到的相同

  • 第一个测试比较慢,因为它运行的时候没有被优化,而第二个循环在开始之前被优化
  • 第二个测试速度较慢,因为JVM在运行时收集优化指标,并使用这些指标优化代码。如果在收集任何指标之前对代码进行了优化,那么它可能会慢得多

显示这种情况的一个简单方法是交换循环的顺序。更好的解决方案是将每个循环放在自己的方法中,并重复测试几次。这确保了它们是独立优化的,并且结果是可重复的。

你从哪里听说的?我在某个网站上看到过,现在我在阅读时产生了这个疑问。你能引用该网站的参考资料吗?嗯。。。为你。从这些博客中可以看出:“枚举的速度是迭代器的两倍,并且使用的内存非常少。”这在一般情况下肯定不是真的。不要相信你在任何随机网站上看到的一切。
Each iteration of Enumeration took 61 ns (Vector), 
    Iteration took 74 ns (Vector), Iteration took 17 ns (ArrayList)
Each iteration of Enumeration took 52 ns (Vector), 
    Iteration took 54 ns (Vector), Iteration took 6 ns (ArrayList)
Each iteration of Enumeration took 52 ns (Vector),  
    Iteration took 54 ns (Vector), Iteration took 6 ns (ArrayList)
Each iteration of Enumeration took 52 ns (Vector),  
    Iteration took 53 ns (Vector), Iteration took 6 ns (ArrayList)
Each iteration of Enumeration took 40 ns (Vector),  
    Iteration took 36 ns (Vector), Iteration took 5 ns (ArrayList)