首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8:流与集合的性能

Java 8:流与集合的性能
EN

Stack Overflow用户
提问于 2014-03-26 18:37:37
回答 5查看 101.8K关注 0票数 157

我是Java 8的新手,对API的了解还不够深入,但我做了一个小的非正式基准测试来比较新的Streams API和好的旧集合的性能。

测试包括过滤Integer列表,对于每个偶数,计算平方根并将其存储在Double的结果List中。

代码如下:

代码语言:javascript
复制
    public static void main(String[] args) {
        //Calculating square root of even numbers from 1 to N       
        int min = 1;
        int max = 1000000;

        List<Integer> sourceList = new ArrayList<>();
        for (int i = min; i < max; i++) {
            sourceList.add(i);
        }

        List<Double> result = new LinkedList<>();


        //Collections approach
        long t0 = System.nanoTime();
        long elapsed = 0;
        for (Integer i : sourceList) {
            if(i % 2 == 0){
                result.add(Math.sqrt(i));
            }
        }
        elapsed = System.nanoTime() - t0;       
        System.out.printf("Collections: Elapsed time:\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));


        //Stream approach
        Stream<Integer> stream = sourceList.stream();       
        t0 = System.nanoTime();
        result = stream.filter(i -> i%2 == 0).map(i -> Math.sqrt(i)).collect(Collectors.toList());
        elapsed = System.nanoTime() - t0;       
        System.out.printf("Streams: Elapsed time:\t\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));


        //Parallel stream approach
        stream = sourceList.stream().parallel();        
        t0 = System.nanoTime();
        result = stream.filter(i -> i%2 == 0).map(i -> Math.sqrt(i)).collect(Collectors.toList());
        elapsed = System.nanoTime() - t0;       
        System.out.printf("Parallel streams: Elapsed time:\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));      
    }.

下面是双核机器的结果:

代码语言:javascript
复制
    Collections: Elapsed time:        94338247 ns   (0,094338 seconds)
    Streams: Elapsed time:           201112924 ns   (0,201113 seconds)
    Parallel streams: Elapsed time:  357243629 ns   (0,357244 seconds)

对于这个特殊的测试,流的速度大约是集合的两倍,并行没有帮助(或者我用错了方式?)。

问题:

  • 这个测试公平吗?我做错了什么吗?
  • 流比集合慢吗?有没有人在这方面做了一个很好的正式基准?
  • 我应该努力采用哪种方法?

已更新结果。

在JVM预热(1k次迭代)之后,我按照@pveentjer的建议运行了1k次测试:

代码语言:javascript
复制
    Collections: Average time:      206884437,000000 ns     (0,206884 seconds)
    Streams: Average time:           98366725,000000 ns     (0,098367 seconds)
    Parallel streams: Average time: 167703705,000000 ns     (0,167704 seconds)

在这种情况下,流的性能更好。我想知道在运行时过滤函数只被调用一次或两次的应用程序中会发生什么。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22658322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档