第四章 并行化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. 转:get value from agent failed: ZBX_TCP_READ() failed;[104] connection reset by peer

    get value from agent failed: ZBX_TCP_READ() failed;[104] connection reset by peer zabbix都搭建好了,进行一下测试 ...

  2. Catalan数应用问题

  3. 在python中连接mysql数据库,并进行增删改查

    数据库在开发过程中是最常见的,基本上在服务端的编程过程中都会使用到,mysql是较常见的一种数据库,这里介绍python如果连接到数据库中,并对数据库进行增删改查. 安装mysql的python扩展 ...

  4. B站实战第三天

    B站实战第三天 用了两天多的时间才把B站页面的头部写完,今天来写头部下面的导航栏部分和轮播图一些模块. 因为还没学js,轮播图部分用swiper来实现. 今天首先复习的知识点是弹性盒模型. 弹性盒模型 ...

  5. ansible使用指北(二)

    前言在上一篇文章里我们了解了ansible的常用模块,今天我们来了解下ansible-playbook,ansbile-playbook是一系统ansible命令的集合,其利用yaml 语言编写,an ...

  6. JasperReport框架使用教程(附带常见空白页问题说明)

    概述与安装使用 1. PDF报表概述 概述 ​ 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之 ...

  7. C++走向远洋——28(项目三,时间类,2)

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

  8. js数据类型大全

    声明变量的命名规范(标识符) 1.不能以数字开头,只能以字母或者¥或者_开头 2.js变量名称区分大小写 3.变量名不能含有关键字(this.if.for.while) 4.驼峰命名法 console ...

  9. Python开发(二):列表、字典、元组与文件处理

    Python开发(二):列表.字典.元组与文件处理 一:列表二:元组三:字典四:文件处理 一:列表   为什么需要列表 可以通过列表可以对数据实现最方便的存储.修改等操作.字符串是不能修改的,所以无法 ...

  10. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...