• Stream.toList()和Collectors.toList()的性能比较


    昨天给大家介绍了Java 16中的Stream增强,可以直接通过toList()来转换成List

    主要涉及下面这几种转换方式:

    list.stream().toList();
    list.stream().collect(Collectors.toList());
    list.stream().collect(Collectors.toUnmodifiableList());
    • 1
    • 2

    然后,看到有网友评论问:Stream.toList()Collectors.toList()的区别是什么?哪个性能好?

    处理结果的区别,其实上一篇文章和视频里都有说:

    • Stream.toList()返回的List是不可变List,不能增删改
    • Collectors.toList()返回的是个普通的List,可以增删改
    • Collectors.toUnmodifiableList()返回的List是不可变List,不能增删改

    而至于性能的话,今天我们就来测试一下,看看哪个性能更好。

    @BenchmarkMode(Mode.All)
    @Fork(1)
    @State(Scope.Thread)
    @Warmup(iterations = 20, time = 1, batchSize = 10000)
    @Measurement(iterations = 20, time = 1, batchSize = 10000)
    public class BenchmarkStreamToList {
    
        @Benchmark
        public List<Integer> streamToList() {
            return IntStream.range(1, 1000).boxed().toList();
        }
    
        @Benchmark
        public List<Integer> collectorsToList() {
            return IntStream.range(1, 1000).boxed().collect(Collectors.toList());
        }
    
        @Benchmark
        public List<Integer> streamToList() {
            return IntStream.range(1, 1000).boxed().toList();
        }
    
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    结果报告:

    Benchmark                                                                                  Mode  Cnt   Score    Error  Units
    BenchmarkStreamToList.collectorsToList                                                    thrpt   20  24.422 ±  0.268  ops/s
    BenchmarkStreamToList.collectorsToUnmodifiableList                                        thrpt   20  22.784 ±  0.599  ops/s
    BenchmarkStreamToList.streamToList                                                        thrpt   20  31.779 ±  1.732  ops/s
    BenchmarkStreamToList.collectorsToList                                                     avgt   20   0.045 ±  0.006   s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList                                         avgt   20   0.062 ±  0.035   s/op
    BenchmarkStreamToList.streamToList                                                         avgt   20   0.040 ±  0.028   s/op
    BenchmarkStreamToList.collectorsToList                                                   sample  445   0.046 ±  0.002   s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.00                            sample        0.039            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.50                            sample        0.041            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.90                            sample        0.057            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.95                            sample        0.073            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.99                            sample        0.102            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.999                           sample        0.150            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.9999                          sample        0.150            s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p1.00                            sample        0.150            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList                                       sample  460   0.044 ±  0.001   s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.00    sample        0.042            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.50    sample        0.044            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.90    sample        0.046            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.95    sample        0.047            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.99    sample        0.051            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.999   sample        0.057            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.9999  sample        0.057            s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p1.00    sample        0.057            s/op
    BenchmarkStreamToList.streamToList                                                       sample  655   0.031 ±  0.001   s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.00                                    sample        0.030            s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.50                                    sample        0.031            s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.90                                    sample        0.032            s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.95                                    sample        0.033            s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.99                                    sample        0.035            s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.999                                   sample        0.037            s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.9999                                  sample        0.037            s/op
    BenchmarkStreamToList.streamToList:streamToList·p1.00                                    sample        0.037            s/op
    BenchmarkStreamToList.collectorsToList                                                       ss   20   0.043 ±  0.001   s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList                                           ss   20   0.045 ±  0.004   s/op
    BenchmarkStreamToList.streamToList                                                           ss   20   0.031 ±  0.001   s/op
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    从报告中我们可以看到:

    • 吞吐量:streamToList > collectorsToList > collectorsToUnmodifiableList
    • 平均耗时:streamToList > collectorsToList > collectorsToUnmodifiableList
    • p0.9999耗时:streamToList > collectorsToUnmodifiableList > collectorsToList
    • 冷启动耗时:streamToList > collectorsToList > collectorsToUnmodifiableList

    所以,Stream.toList()的性能要各方面都要好于Collectors.toList()Collectors.toUnmodifiableList()

    如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步! 本文收录在了我正在连载的《Java新特性专栏》,该系列该用电子书的方式编写,如果想要沉浸式阅读学习的话,可以访问Web版本:https://www.didispace.com/java-features/

    https://www.didispace.com/java-features/

    再放大一些数据量,试试:

    @Benchmark
    public List<Integer> streamToList() {
      return IntStream.range(1, 10000).boxed().toList();
    }
    
    @Benchmark
    public List<Integer> collectorsToList() {
      return IntStream.range(1, 10000).boxed().collect(Collectors.toList());
    }
    
    @Benchmark
    public List<Integer> streamToList() {
      return IntStream.range(1, 10000).boxed().toList();
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结果报告:

    Benchmark                                                                                  Mode  Cnt  Score   Error  Units
    BenchmarkStreamToList.collectorsToList                                                    thrpt   20  2.186 ± 0.162  ops/s
    BenchmarkStreamToList.collectorsToUnmodifiableList                                        thrpt   20  2.184 ± 0.042  ops/s
    BenchmarkStreamToList.streamToList                                                        thrpt   20  3.538 ± 0.058  ops/s
    BenchmarkStreamToList.collectorsToList                                                     avgt   20  0.426 ± 0.004   s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList                                         avgt   20  0.469 ± 0.016   s/op
    BenchmarkStreamToList.streamToList                                                         avgt   20  0.293 ± 0.008   s/op
    BenchmarkStreamToList.collectorsToList                                                   sample   58  0.448 ± 0.049   s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.00                            sample       0.414           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.50                            sample       0.422           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.90                            sample       0.458           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.95                            sample       0.560           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.99                            sample       1.160           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.999                           sample       1.160           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p0.9999                          sample       1.160           s/op
    BenchmarkStreamToList.collectorsToList:collectorsToList·p1.00                            sample       1.160           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList                                       sample   60  0.458 ± 0.004   s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.00    sample       0.447           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.50    sample       0.455           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.90    sample       0.471           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.95    sample       0.482           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.99    sample       0.492           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.999   sample       0.492           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p0.9999  sample       0.492           s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList:collectorsToUnmodifiableList·p1.00    sample       0.492           s/op
    BenchmarkStreamToList.streamToList                                                       sample   78  0.293 ± 0.012   s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.00                                    sample       0.277           s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.50                                    sample       0.284           s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.90                                    sample       0.309           s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.95                                    sample       0.377           s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.99                                    sample       0.459           s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.999                                   sample       0.459           s/op
    BenchmarkStreamToList.streamToList:streamToList·p0.9999                                  sample       0.459           s/op
    BenchmarkStreamToList.streamToList:streamToList·p1.00                                    sample       0.459           s/op
    BenchmarkStreamToList.collectorsToList                                                       ss   20  0.474 ± 0.133   s/op
    BenchmarkStreamToList.collectorsToUnmodifiableList                                           ss   20  0.493 ± 0.099   s/op
    BenchmarkStreamToList.streamToList                                                           ss   20  0.325 ± 0.056   s/op
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    从报告中我们可以看到

    • 吞吐量:streamToList > collectorsToList > collectorsToUnmodifiableList
    • 平均耗时:streamToList > collectorsToList > collectorsToUnmodifiableList
    • p0.9999耗时:streamToList > collectorsToUnmodifiableList > collectorsToList
    • 冷启动耗时:streamToList > collectorsToList > collectorsToUnmodifiableList

    所以,即使集合内的元素增大,Stream.toList()的性能在各方面依然都要好于Collectors下的方法。

    好了,今天的分享就到这里,你学会了吗?

    本期视频:https://www.bilibili.com/video/BV16Y411F7Pm/

    欢迎关注我的公众号:程序猿DD。前沿技术早知道,弯道超车有希望!积累超车资本,从关注DD开始!

  • 相关阅读:
    动态负荷对电力系统摆幅曲线的影响研究(Matlab代码实现)
    app专项测试:app弱网测试
    LeetCode 3.4.5题
    主流编程语言介绍
    Elasticsearch alias 使用
    垃圾收集器与内存分配策略
    软件设计模式白话文系列(十一)享元模式
    应用安全系列之三十七:日志注入
    ES & Kibana 简介
    设计模式——结构型模式——责任链模式
  • 原文地址:https://blog.csdn.net/dyc87112/article/details/124954044