前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java8-stream流操作串行与并行效率比对

java8-stream流操作串行与并行效率比对

作者头像
cosmozhu
发布2020-06-15 06:37:18
1.2K0
发布2020-06-15 06:37:18
举报
文章被收录于专栏:cosmozhu技术篇cosmozhu技术篇

最近在看java8新特性时看到了stream,其中看到了stream支持串行与并行两种操作,本着实事求是的精神cosmo在实现环境验证了这两种操作的实际效率。

测试代码逻辑是对集合中的元素取筛选对2取余为0的元素。

代码语言:javascript
复制
    //串行操作
    public static void main(String[] args) {
        List<Integer> l = new ArrayList();
        for (int i = 0, size = 1000 * 1000 * 1; i < size; i++) {
            l.add(i);
        }
        long begin = System.currentTimeMillis();
        List<Integer> collect = l.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
        long end = System.currentTimeMillis();
        System.out.println("耗时总计" + (end - begin) + "ms");
    }
代码语言:javascript
复制
    //并行操作
    public static void main(String[] args) {
        List<Integer> l = new ArrayList();
        for (int i = 0, size = 1000 * 1000 * 1; i < size; i++) {
            l.add(i);
        }
        long begin = System.currentTimeMillis();
        List<Integer> collect = l.stream().filter(i -> i % 2 == 0).parallel().collect(Collectors.toList());
        long end = System.currentTimeMillis();
        System.out.println("耗时总计" + (end - begin) + "ms");
    }

cosmo 分别测试了1Million和10Million(100Million,OOM了就不放出来了)

数据量

串行

并行

1M

96ms

163ms

10M

117ms

178ms

这么看起来在单次计算量较少的情况下并行操作并没有比串行操作快。cosmo猜测是因为在数据规模较小、单次操作花费较小时,串行操作直接计算,而并行操作需先对数据分片后多线程处理。

为了验证我们的猜测正确,对测试代码稍加改动,在每次执行操作之前让线程休眠1ms。

代码语言:javascript
复制
    //串行操作
    public static void main(String[] args) {
        List<Integer> l = new ArrayList();
        for (int i = 0, size = 1000 * 1 * 1; i < size; i++) {
            l.add(i);
        }
        long begin = System.currentTimeMillis();
        List<Integer> collect = l.stream().filter(i -> {
            try {
                TimeUnit.MILLISECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return i % 2 == 0;
        }).collect(Collectors.toList());
        long end = System.currentTimeMillis();
        System.out.println("耗时总计" + (end - begin) + "ms");
    }
代码语言:javascript
复制
    //并行操作
    public static void main(String[] args) {
        List<Integer> l = new ArrayList();
        for (int i = 0, size = 1000 * 1 * 1; i < size; i++) {
            l.add(i);
        }
        long begin = System.currentTimeMillis();
        List<Integer> collect = l.stream().filter(i -> {
            try {
                TimeUnit.MILLISECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return i % 2 == 0;
        }).parallel().collect(Collectors.toList());
        long end = System.currentTimeMillis();
        System.out.println("耗时总计" + (end - begin) + "ms");
    }

数据量

串行

并行

1000

1089ms

308ms

10000

10068ms

2577ms

不出所料在增加单次计算的花费之后并行操作效率远高于串行操作。由此可见并行操作并非一定比串行操作快,我们在使用时一定要注意应用场景。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档