for循环与串行化、并行化Stream流性能对比
第四章 并行化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());
}
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完整版。
近期教程:

for循环与串行化、并行化Stream流性能对比的更多相关文章
- MFC【6】文件I/O和串行化
文件输入和输出(I/O)服务是所有操作系统的主要工作.Microsoft Windows提供了各种API函数用来读.写和操作磁盘文件.MFC将这些桉树和CFile类融合在面对对象的模型里.其中CFil ...
- MFC如何生成一个可串行化的类
一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...
- MFC文件IO和串行化
一. MFC中CFile对象实现了磁盘文档的读写,但是大部分MFC应用程序的IO服务都使用CArchive对象来完成.不管CFile和Archive输入输出的都是二进制数据,非文本数据. int a ...
- VC++ MFC如何生成一个可串行化的类
一.MFC允许对象在程序运行的整个过程中持久化的串行化机制(1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程.(2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构)的 ...
- C#基础知识回顾--串行化与反串行化
串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上, 在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性, ...
- C#--串行化与反串行化
串行化是指存储和获取磁盘文件.内存或其他地方中的对象.在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来.只需给类添加Serializable属性,就 ...
- MFC用串行化实现文档存储和读取功能
在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...
- 【原创】uwsgi中多进程+多线程原因以及串行化accept() - thunder_lock说明
如有不对,请详细指正. 最近再研究uwsgi如何部署python app,看uwsgi的文档,里面有太多的参数,但每个参数的解释太苍白,作为菜鸟的我实在是不懂.想搞清楚uwsgi的工作原因以及里面的一 ...
- Hadoop基础-Protocol Buffers串行化与反串行化
Hadoop基础-Protocol Buffers串行化与反串行化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过很多种序列化文件格式,比如python中的pickl ...
随机推荐
- annoy超平面多维近似向量查找工具
需求:有800万的中文词向量,要查询其中任意一个词向量对应的k个与其最邻近的向量.通常情况下如果向量集比较小的话,几十万个向量(几个G这种),我们都可以用gensim的word2vec来查找,但是88 ...
- 如何在linux中查找python安装包的路径
[root]# python -c "import fasttext;print(fasttext)"<module 'fasttext' from '/root/anaco ...
- Python包管理工具setuptools相关
setup函数常用参数: --name 包名称 --version 包版本 --author ...
- leetcode_315_逆序对问题
题目描述 本题来自于Leetcode的算法题库第315题,具体题目描述如下: 给定一个nums整数数组 ,按要求返回一个counts新数组 .数组 counts 有该性质: counts[i]的值是 ...
- JNI 问题 wrong ELF class
使用JNI发现一个问题, wrong ELF class: ELFCLASS64)主要是机器是64位的OS,默认编译的.so是64位 而java设置的默认是32位 JDK, 所以会出现这个问题.那么就 ...
- 下一个风口?迷你KTV能变成“绿巨人”吗
近段时间,在全国各地多个商场.大学城等繁华地点,一种全新娱乐方式--迷你KTV变得火爆起来.这种仅能容纳两三人,以单首.时段等进行计费,且价格不低的点唱新模式,正成为投资者眼中的"新宠&qu ...
- MIZ702N开发环境的准备1
前言 最近由于工作需要开始接手基于MIZ702的硬件平台的Linux的开发,仔细想想,工作这么久,这好像还是我第一次接手嵌入式Liunx相关的工作.这几天拿到开发板,开始了阅读文档.安装Ubuntu虚 ...
- 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)
AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...
- docker学习读书笔记-一期-整理
0.Docker - 第零章:前言 1.Docker - 第一章:Docker简介 2.Docker - 第二章:第一个Docker应用 3.Docker - 第三章:Docker常用命令 4.Doc ...
- 先搞清楚这些问题,简历上再写你熟悉Java!
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...