第四章 并行化Stream流

关注公众号(CoderBuff)回复“stream”获取《Java8 Stream编码实战》PDF完整版。

《Java8 Stream编码实战》的代码全部在https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/stream-coding,一定要配合源码阅读,并且不断加以实践,才能更好的掌握Stream。

在现实当中,并行化流开始并没有引起我的注意,直到我发现了它的应用场景后才发现,并行化流在提高性能以及编码难易程度上,代码bug上似乎要更胜一筹。

“第三章 Stream流”一直介绍的是串行化的流,串行化的流如果你有心可以和for循环对比,会发现串行化的流在性能上是比for循环要差的。这也是部分人“鄙视”Stream流的一点。

4.1 并行与并发

并行,指的是在同一时刻多个任务同时执行。

并发,指的是在同一时间段多个任务交替执行。

当然,并行的执行速度更快,但并行也依赖硬件设置,因为它依赖硬件CPU是多核的场景。并发则不受限制。

parallelStream

想要把串行流转换为并行流很简单,只需要将stream修改为parallelStream,其它操作不变。

public void parallel(List<Student> students) {
students.parallelStream()
.map(Student::getStudentNumber)
.collect(Collectors.toList());
}
com.coderbuff.chapter4_parallelstream.ParallelStreamDemo#parallel

Stream流的并行化操作,是一种数据并行化,流本身就擅长对数据进行运算。

当然并不是将代码里所有的串行流改为并行流就万事大吉性能翻倍了,数据少了不行,CPU核数不够也不行。所以要想真正能提高性能,还要针对实际请做测试才能得出结论。

我们分别举几个数据量不同的例子,来说明for循环、串行化Stream流、并行化Stream流的性能在我本机的性能。

我测试了9个学生、90个学生、9000个学生、90000个学生后,三者的性能表现如下图所示:

com.coderbuff.chapter4_parallelstream.PerformanceTests

操作 9个学生 90个学生 900个学生 9000个学生 90000个学生 900000个学生
for循环 0ms 0ms 2ms 8ms 41ms 343ms
串行化Stream 61ms 1ms 2ms 4ms 27ms 789ms
并行化Stream 4ms 0ms 4ms 3ms 88ms 358ms

从曲线图可以看出90000个学生以前3者的性能都是几毫秒,并没有太大区别,从90000个学生过后,串行化流性能主键走弱,并行化流的性能开始逐渐赶上for循环,但注意这并不意味着从900000个数据后并行化的数据就一定会超越for循环。由于后两组测试数据比较大,我们去掉90000和900000这两组数据的性能曲线图。

从这张图可以看到,串行化流在数据量很小的情况下,性能最差。而并行化流则处于波动的状态。

所以单单从数据量上可以看出:

for循环的性能随着数据量的增加性能也越来越差。

串行化流则在数据量小的情况下性能差,数据量中、大的时候性能略高于for循环,但当数据量特别大时,性能也变得越差。

并行化流受CPU核数的影响,在本机2核下,在数据量小的情况下性能略高于串行化流,略低于for循环,在数据量中的情况下差不多,在数据量比较大时性能最差,但当数据量特别大时,性能也变得更好。

如果想要使用parallelStream想提高性能,一定要根据实际情况做好测试,因为并行化的流性能不一定比串行化流性能高

关注公众号(CoderBuff)回复“stream”抢先获取PDF完整版。

近期教程:

《ElasticSearch6.x实战教程》

《Redis5.x入门教程》

《Java8 编码实战》

一个能给程序员加buff的公众号 (CoderBuff)

for循环与串行化、并行化Stream流性能对比的更多相关文章

  1. MFC【6】文件I/O和串行化

    文件输入和输出(I/O)服务是所有操作系统的主要工作.Microsoft Windows提供了各种API函数用来读.写和操作磁盘文件.MFC将这些桉树和CFile类融合在面对对象的模型里.其中CFil ...

  2. MFC如何生成一个可串行化的类

    一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...

  3. MFC文件IO和串行化

    一. MFC中CFile对象实现了磁盘文档的读写,但是大部分MFC应用程序的IO服务都使用CArchive对象来完成.不管CFile和Archive输入输出的都是二进制数据,非文本数据. int a ...

  4. VC++ MFC如何生成一个可串行化的类

    一.MFC允许对象在程序运行的整个过程中持久化的串行化机制(1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程.(2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构)的 ...

  5. C#基础知识回顾--串行化与反串行化

    串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上, 在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性, ...

  6. C#--串行化与反串行化

    串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性,就 ...

  7. MFC用串行化实现文档存储和读取功能

    在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...

  8. 【原创】uwsgi中多进程+多线程原因以及串行化accept() - thunder_lock说明

    如有不对,请详细指正. 最近再研究uwsgi如何部署python app,看uwsgi的文档,里面有太多的参数,但每个参数的解释太苍白,作为菜鸟的我实在是不懂.想搞清楚uwsgi的工作原因以及里面的一 ...

  9. Hadoop基础-Protocol Buffers串行化与反串行化

    Hadoop基础-Protocol Buffers串行化与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过很多种序列化文件格式,比如python中的pickl ...

随机推荐

  1. toString()和强制类型转换(String)的用法

    原来是String类型的才可以强转到String,不然会报 ClassCastException异常: 所有的引用类型都从Object类继承了toString方法.

  2. windows 下 基于express搭建 https协议的网站

    参考 https://blog.csdn.net/xingyanchao/article/details/79362443 问题在于生成SSL证书的时候Windows环境下会报错 解决方案 参考 ht ...

  3. mac下配置开发环境

    常用命令 显示隐藏文件 1 defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder 关闭隐藏文 ...

  4. MyBatis连接MySQL8配置

    <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</a ...

  5. 80 remove duplicates from sorted array 2

    | 分类 leetcode  | Follow up for "Remove Duplicates": What if duplicates are allowed at most ...

  6. 关于排序原生js实现

    内外排序的区别 排序可以分为两种:内排序和外排序.当数据量不算太大的时候,计算可以在内存中完成的排序称为内排序.当数据量特别大,计算的数据,需要分多次进入内存中进行计算的排序称之为外排序 插入排序 直 ...

  7. C++走向远洋——20(项目一,三角形,类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...

  8. C#中使用 正则表达式 替换img中src路径但保留图片名

    text = Regex.Replace(text, @"(?i)(?<=<img\b[^>]*?src=\s*(['""]?))([^'"& ...

  9. KEMET推出新的多层陶瓷电容器,用于市电供电的应用

    前言:2019年12月2日,全球领先的电子组件供应商KEMET公司 (“ KEMET”或“公司”)推出了一系列新的表面安装设备(SMD)安全认证的多层陶瓷电容器(MLCC),用于市电供电的应用.与现有 ...

  10. 正式学习MVC 04

    1.ActionResult ActionResult是一个父类, 子类包括了我们熟知的 ViewResult 返回相应的视图 ContentResult  返回字符串 RedirectResult( ...