for,Iterator,Stream对集合遍历操作的时间性能的简单比较

背景

最近,需要优化程序的性能,为了尽可能地减少时间,我尝试从尽量多的方面提升性能,包括加快循环。为此我将程序中的对集合的循环改换为stream操作,但出乎意料的是,即便是parallelStream,循环的效率反而不如for循环。在查阅了网上许多的资料和博客,并自己做了实验之后,才正确地认识到这些语句产生的目的。

实验

首先是自己做实验用的代码

@Test
public void forTest() {
    Set a = source();		 //用作循环的集合,包含从1到1千万的integer
    
    long startTime = System.currentTimeMillis();
    
    long sum = 0;
    for (Integer i : a) {			//for循环
      sum += i;
    }
    System.out.println(sum);
    
    long endTime = System.currentTimeMillis();
    System.out.println("for循环消耗了" + (endTime - startTime) + "ms");
}

此外,还有迭代器,parallelStream两种实现方式,下为核心代码

//Iterator
    Iterator it = a.iterator();
    long sum = 0;
    while (it.hasNext()) {
      sum += it.next();
    }

//Stram  
    long sum = a.parallelStream().mapToInt((x) -> x).summaryStatistics().getSum();

实验结果

在经过了测试之后,得到结果
for,Iterator,Stream对集合遍历操作的时间性能的简单比较_第1张图片

实验结论

从循环的时间性能上来讲,for优于迭代器优于stream

看法

在翻阅的很多资料中,得到的结果都一致的说明了stream用作循环时性能确实反而下降了,同时也有很多人提到,stream的产生使得代码写起来更简便,看起来更美观,这应该就是stream诞生的原因吧。

你可能感兴趣的:(java,学习,效率,循环,对比)