我一直在尝试通过一个简单的 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
(仅保证为 -128
到 127
),一个新的 Integer
对象被创建。
ArrayList
不会发生这种情况,因为转换发生在将 Integer
存储到列表中之前。
TArrayList
有a custom iterator type返回原始类型 int
,不需要创建 Integer
对象。
关于java - 自定义迭代器很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39698738/