首页 > Java > java教程 > 对于简单的操作,流总是比传统集合慢吗?

对于简单的操作,流总是比传统集合慢吗?

Mary-Kate Olsen
发布: 2024-11-03 17:46:02
原创
953 人浏览过

Are Streams Always Slower Than Traditional Collections for Simple Operations?

Java 8 流性能对比。传统集合

您最近涉足 Java 8 并进行了非正式基准测试,以将其 Stream API 与经典集合的性能进行比较。您的测试涉及过滤整数列表、提取偶数的平方根并将结果存储在 Double 列表中。然而,您质疑测试的有效性,并渴望澄清真正的性能影响。

评估基准测试

您的初步结果,表明流比收集慢,引发了担忧。为了确保更可靠的评估,必须解决潜在的错误并进行公平的测试。以下是一些注意事项:

  • 使用 LinkedList:LinkedList 不是结果列表的最佳选择,因为它缺乏有效的随机访问。考虑使用 ArrayList 代替。
  • 基准测试方法:手动基准测试可能容易出现不准确的情况。利用像 JMH(Java Microbenchmarking Harness)这样的基准测试框架来提供更精确和可靠的测量。

正确的基准测试结果

根据这些建议,让我们重新审视使用 JMH 和改进的基准测试策略进行性能评估:

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(StreamVsVanilla.N)
public class StreamVsVanilla {
    public static final int N = 10000;

    static List<Integer> sourceList = new ArrayList<>();
    static {
        for (int i = 0; i < N; i++) {
            sourceList.add(i);
        }
    }

    @Benchmark
    public List<Double> vanilla() {
        List<Double> result = new ArrayList<>(sourceList.size() / 2 + 1);
        for (Integer i : sourceList) {
            if (i % 2 == 0){
                result.add(Math.sqrt(i));
            }
        }
        return result;
    }

    @Benchmark
    public List<Double> stream() {
        return sourceList.stream()
                .filter(i -> i % 2 == 0)
                .map(Math::sqrt)
                .collect(Collectors.toCollection(
                    () -> new ArrayList<>(sourceList.size() / 2 + 1)));
    }
}
登录后复制

结果:

Benchmark                   Mode   Samples         Mean   Mean error    Units
StreamVsVanilla.stream      avgt        10       17.588        0.230    ns/op
StreamVsVanilla.vanilla     avgt        10       10.796        0.063    ns/op
登录后复制

结果

与初步结果,JMH 基准测试清楚地表明,在此特定场景中,传统收集方法明显快于流方法。

结论

基于这些改进的基准测试结果,我们可以得出结论:

  • 流本质上并不比集合慢。然而,在某些用例中,它们的开销可能超过其好处,例如简单的过滤和映射操作。
  • 流在代码简单性和可维护性方面提供了显着的优势。它们简化了数据处理管道并减少了样板代码。
  • 对于性能关键的代码路径,始终建议进行彻底的基准测试并考虑应用程序的具体要求。

以上是对于简单的操作,流总是比传统集合慢吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板