gpt4 book ai didi

java - 自定义迭代器很慢

转载 作者:行者123 更新时间:2023-12-02 15:16:57 24 4
gpt4 key购买 nike

我一直在尝试通过一个简单的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com