java - 自定义迭代器很慢

标签 java performance iterator

我一直在尝试通过一个简单的 int 数组来衡量我的自定义迭代器的性能。其实很简单,如下图:

class IntArrayIterator_NoCheck implements Iterator<Integer> {

    private final int[] array;
    private int counter = 0;

    public IntArrayIterator_NoCheck( int[] array ) {
        this.array = array;
    }

    @Override
    public boolean hasNext() {
        return counter < array.length;
    }

    @Override
    public Integer next() {
        return array[counter++];
    }

}

将它与 ArrayList 迭代器和 Trove ( http://trove.starlight-systems.com/ ) 进行比较后,我发现了奇怪的结果。测试以下列方式进行:

  • 100000 个随机 int 元素的列表/数组
  • 热身
    • 对整个集合进行 10000 次迭代
    • 再次对整个集合进行 10000 次迭代
  • 测试
    • 对整个集合进行 10000 次迭代,通过 System.nanoTime 和 ThreadMXBean.getCurrentThreadCpuTime() 进行测量

Trove TIntArrayList 迭代器是最快的迭代器,运行时间为 30 毫秒。 Java ArrayList 迭代器有 85 毫秒的运行时间。简单 int 数组上的自定义迭代器有 320 毫秒的运行时间!

我的自定义迭代器性能糟糕的可能原因是什么?在查看 ArrayList 和 TIntArrayList 迭代器实现后,它们要复杂得多(执行更多操作),因此我不明白为什么它更快。任何人都可以向我解释一下吗?

最佳答案

您的next 方法将生成与

相同的字节码
public Integer next() {
    return Integer.valueOf(array[counter++]);
}

请注意,对于缓存值范围之外的任何 int(仅保证为 -128127),一个新的 Integer 对象被创建。

ArrayList 不会发生这种情况,因为转换发生在将 Integer 存储到列表中之前。
TArrayLista custom iterator type返回原始类型 int,不需要创建 Integer 对象。

关于java - 自定义迭代器很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39698738/

相关文章:

java - JComboBox自定义ListCellRenderer

java - hibernate : Criteria ignoring fetchSize parameter and fetching more rows than asked

C++ recursive_directory_iterator 遗漏一些文件

c++ - C++ STL 中的 const_iterator 和非 const 迭代器有什么区别?

boost - 使用 Boost Python 将 Python 列表输入到接受向量的函数中

Java递归函数行为

database - SSIS Excel 数据提取

arrays - react : Update element of array without rerendering other array elements

Python NUMPY HUGE 矩阵乘法

java - 表名中的特殊字符 hibernate 给出错误