【发布时间】:2017-02-03 13:19:32
【问题描述】:
我一直在尝试衡量我的自定义迭代器在一个简单的 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 元素的列表/数组
- 热身
- 10000x 迭代整个集合
- 10000x 再次遍历整个集合
- 测试
- 10000x 迭代整个集合,通过 System.nanoTime 和 ThreadMXBean.getCurrentThreadCpuTime() 测量
Trove TIntArrayList 迭代器是最快的迭代器,运行时间为 30 毫秒。 Java ArrayList 迭代器的运行时间为 85 毫秒。简单 int 数组上的自定义迭代器有 320 毫秒的运行时间!
我的自定义迭代器性能糟糕的可能原因是什么?在查看 ArrayList 和 TIntArrayList 迭代器实现之后,它们要复杂得多(执行更多操作),因此我不明白为什么它更快。谁能给我解释一下?
【问题讨论】:
-
不要手动编写这样的基准测试代码,使用 JMH:openjdk.java.net/projects/code-tools/jmh
-
感谢您的建议!我会调查的。
标签: java performance iterator