java8流分组 性能_Java性能教程– Java 8流有多快?

java8流分组 性能

在此JAX Magazine的预览预览中,JAX伦敦发言人Angelika Langer为使用Java流的任何人回答了最重要的问题:它们真的更快吗?

Java 8是JDK收集框架的主要补充,即流​​API。 与集合相似,流表示元素序列。 集合支持对单个元素起作用的操作,例如add()remove()contains() 。 相反,流具有批量操作,例如forEach()filter()map()reduce() ,它们访问序列中的所有元素。 Java流的概念受到功能性编程语言的启发,其中相应的抽象通常称为序列,该序列也具有filter-map-reduce操作。 由于这种相似性,Java 8(至少在某种程度上)除了一直支持的面向对象范例之外,还允许一种功能性的编程风格。

也许与普遍的看法相反,Java编程语言的设计人员没有扩展Java及其JDK来允许Java中的功能编程,也没有将Java变成“目标与功能”混合编程语言。 发明Java流的实际动机是性能,或者更准确地说,是使并行性更易于软件开发人员访问(请参见Lambda州的Brian Goetz )。 考虑到硬件的发展方式,这个目标对我来说很有意义。 我们的硬件今天有数十个cpu内核,将来可能还会有数百个。 为了有效利用硬件功能,从而达到最新的执行性能,我们必须并行化。 毕竟–在多核平台上运行单个线程有什么意义? 同时,多线程编程被认为是困难且容易出错的,这是正确的。 流有两种形式(顺序流和并行流),旨在隐藏运行多个线程的复杂性。 并行流使魔术,毫不费力地以每个Java开发人员都可以访问的方式并行执行批量操作变得极为容易。

并行流操作是否比顺序操作快? 听到Angelika Langer在2015年JAX伦敦上的演讲。

因此,让我们谈谈性能。 Java 8流有多快? 一个普遍的期望是流操作的并行执行比仅单个线程的顺序执行要快。 是真的吗 流会提高性能吗?

为了回答有关性能的问题,我们必须进行衡量,即运行一个微基准测试。 标杆管理也很困难且容易出错。 您需要执行适当的预热,注意各种失真的影响,从虚拟机的JIT编译器应用的优化(消除死代码是臭名昭著的)到硬件优化(例如增加一个内核的cpu频率),其他核心处于闲置状态)。 通常,必须以一粒盐作为基准结果。 每个基准都是实验。 其结果取决于上下文。 永远不要相信在您的硬件环境中尚未产生的基准数据。 这样说,让我们尝试一下。

将流与循环进行比较

首先,我们想了解流的批量操作与常规的传统for-比较。 首先出于性能考虑是否值得使用流?

我们将用于基准测试的序列是一个int-数组,其中填充了500,000个随机整数值。 在此数组中,我们将搜索最大值。

这是带有for-循环的传统解决方案:

int[] a = ints;
int e = ints.length;
int m = Integer.MIN_VALUE;
for(int i=0; i < e; i++)   if(a[i] > m) m = a[i];

这是使用顺序IntStream的解决方案:

int m = Arrays.stream(ints).reduce(Integer.MIN_VALUE, Math::max);

我们在具有适当预热功能的过时硬件(双核,无动态超频)上进行了测量,并得出了中途可靠的基准数据。 这是在特定情况下的结果:

int-array, for-loop : 0.36 ms
int-array, seq. stream: 5.35 ms

结果令人震惊:旧的for-循环比顺序流快15倍。 真令人失望! 多年的开发工作花费在为Java 8构建流上,然后进行此?!?!? 可是等等! 在得出流非常慢的结论之前,让我们看看如果用ArrayList <Integer>替换int- array会发生什么。

这是for-循环:

int m = Integer.MIN_VALUE;
for (int i : myList)if (i>m) m=i;

这是基于流的解决方案:

int m = myList.stream().reduce(Integer.MIN_VALUE, Math::max);

结果如下:

ArrayList, for-loop : 6.55 ms
ArrayList, seq. stream: 8.33 ms

同样, for-循环比顺序流操作要快,但是ArrayList上的差异不如在阵列上那么重要。

让我们考虑一下。 为什么结果相差这么大? 有几个方面需要考虑。

首先,访问数组元素非常快。 这是基于索引的内存访问,没有任何开销。 换句话说,这是简单的底层存储访问。 另一方面,通过迭代器访问集合中的元素(例如ArrayList),并且迭代器不可避免地增加了开销。 另外,对集合元素进行装箱和拆箱会产生开销,而int数组则使用普通原始类型int。 本质上,对于该ArrayList测量通过迭代和拳击开销而对于INT-阵列附图示出的优点是支配for-环路。

其次,我们是否曾认真地期望过流会比普通的for-loop更快? 编译器在优化循环方面拥有40多年的经验,虚拟机的JIT编译器尤其适合以与我们的基准测试相同的步伐来优化阵列上的for-循环。 另一方面,流是Java的最新扩展,并且JIT编译器(尚未)尚未对其执行任何特别复杂的优化。

第三,我们必须记住,一旦掌握了序列元素,我们就不会做太多事情。 我们花了很多精力来尝试访问元素,然后对它做得很少。 我们只比较两个整数,在JIT编译之后,它们几乎不止一个汇编指令。 因此,我们的基准测试说明了元素访问的成本–不一定是典型情况。 如果应用于序列中每个元素的功能是CPU密集型的,则性能指标将发生重大变化。 您会发现,如果功能受CPU的限制很大,则for循环流和顺序流之间将不再有可测量的差异。

加入我们的伦敦JAX – Java和软件创新者大会。 使用以下代码可享受10%的折扣:MP_JCG10

从这个基准实验得出的最终结论不是流总是比循环慢。 是的,流有时比循环慢,但它们也可以同样快。 这取决于情况。 带回家的要点是顺序流不会比循环快。 如果使用顺序流,则出于性能原因,请不要这样做; 之所以这样做,是因为您喜欢函数式编程风格。

那么,性能改进流是在哪里发明的呢? 到目前为止,我们仅将循环与流进行了比较。 并行化如何? 流的点是易于并行化,以实现更好的性能。

比较顺序流与并行流

作为第二个实验,我们想弄清楚顺序流与并行流在性能方面的比较。 并行流操作是否比顺序操作快?

我们使用填充500,000个整数值的同一int-数组。 这是顺序流操作:

int m = Arrays.stream(ints).reduce(Integer.MIN_VALUE, Math::max);

这是并行流操作:

int m = Arrays.stream(ints).parallel().reduce(Integer.MIN_VALUE, Math::max);

我们的期望是并行执行应该比顺序执行更快。 由于测量是在双核平台上进行的,因此并行执行最多可以是顺序执行的两倍。 理想情况下,顺序/并行性能之比应为2.0。自然地,并行执行确实会引入一些开销,用于拆分问题,创建子任务,在多个线程中运行子任务,收集其部分结果以及产生总体结果。 该比率将小于2.0,但应该接近。

这些是实际的基准测试结果:

sequential parallel seq./par.
int-array 5.35 ms    3.35 ms  1.60

通过我们的基准进行的现实检查得出的比率(顺序/并行)仅为1.6而不是2.0,这说明了并行执行涉及的开销量以及(在此特定平台上)如何(好坏)得到超额补偿。

您可能会倾向于概括这些数字并得出结论,并行流始终比顺序流快,也许不如人们希望的那样快(在双核硬件上),但是至少更快。 但是,事实并非如此。 同样,有许多方面有助于并行流操作的性能。

其中之一是流源的可拆分性。 数组可以很好地拆分; 它只需要一个索引计算就可以找出中间元素并将数组分成两半。 没有开销,因此几乎没有拆分成本。 与数组相比,集合拆分的难易程度如何? 拆分二叉树或链表需要什么? 在某些情况下,对于不同类型的集合,您将观察到截然不同的性能结果。

另一个方面是有状态性。 一些流操作保持状态。 一个示例是distinct()操作。 这是一个中间操作,可消除输入序列中的重复项,即,它返回具有不同元素的输出序列。 为了确定下一个元素是否重复,该操作必须与它已经遇到的所有元素进行比较。 为此,它维护某种数据结构作为其状态。 如果在并行流上调用distinct() ,则其状态将被多个工作线程并发访问,这需要某种形式的协调或同步,这会增加开销,从而减慢并行执行的速度,最大程度地降低了并行执行的程度。比顺序执行慢。

考虑到这一点,可以公平地说,流的性能模型并非微不足道。 幼稚地期望并行流操作总是比顺序流操作快。 性能提升(如果有的话)取决于许多因素,我在上面简要提到了其中的一些因素。 如果您熟悉流的内部工作原理,则可以对并行流操作的性能做出明智的猜测。 但是,您需要进行大量基准测试,以便针对给定的上下文确定并行进行是否值得。 实际上,在某些情况下,并行执行要比顺序执行慢,并且在所有情况下盲目使用并行流可能会适得其反。

实现是:是的,并行流操作易于使用,并且通常比顺序操作运行得更快,但是不要指望奇迹。 另外,不要猜测; 相反,要进行很多基准测试。

这是《 JAX杂志》的先睹为快–在此处注册以获取更多免费的开发人员提示,趋势和教程。

翻译自: https://www.javacodegeeks.com/2015/07/java-performance-tutorial-how-fast-are-the-java-8-streams.html

java8流分组 性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对 int 变量赋值的操作是原子的吗?为什么?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删这个是在面试的时候遇到的问题&#xff0c;当时没有答出来。回到家以后查了查&#xff0c;整理记录下来。原问题&#xff1a;什么指令集支持原子…

C语言知识总结:if-else判断语句和switch-case选择语句

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删1、if-else判断语句一个基本的if语句由一个关键字if开头&#xff0c;跟上在括号&#xff08;&#xff09;里边的是表示逻辑条件的表达式&#xf…

hibernate性能_改善Hibernate应用程序性能的7种方法

hibernate性能Hibernate是将Java Web应用程序与SQL数据库集成的好工具&#xff0c;但是当应用程序的响应时间开始显着增加时&#xff0c;我们应该怎么做&#xff1f; 当我们怀疑应用程序是否会随着客户群的增长而扩展时&#xff0c;我们该怎么办&#xff1f; 在花大价钱托管或…

python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度

python学习笔记--坐标轴刻度所用的库及环境:ide:pycharmpython环境&#xff1a;python3.7matplotlib: matplotlib 1.11numpy&#xff1a; numpy1.15.datetime &#xff1a;datetime坐标轴刻度概念当需要把x&#xff0c;y坐标轴刻度调整的更密集些或者更宽松点学习如何调整x&…

为什么永远不会有语言取代C/C++?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删数以百计的 C/C 替代品将会出现&#xff0c;但 C/C 将永远与我们同在&#xff01;每个 CPU 都带有一种称为 ISA&#xff08;指令集架构&#xff…

mwc校准油门_编写下载服务器。 第五部分:油门下载速度

mwc校准油门在僵尸网络时代&#xff0c;您可以租用几百美元来运行自己的分布式拒绝服务攻击&#xff0c;拥有紧急开关来有选择地关闭昂贵的功能或严重降低性能是一个巨大的胜利。 在缓解问题的同时&#xff0c;您的应用程序仍可运行。 当然&#xff0c;这种安全措施在高峰或工作…

sql 非主键每年自增_或许你不知道的 10 条 SQL 技巧

上文我们简述了 SQL 的一些进阶技巧&#xff0c;一些朋友觉得不过瘾&#xff0c;我们继续来下篇&#xff0c;再送你 10 个技巧一、 使用延迟查询优化 limit [offset], [rows]经常出现类似以下的 SQL 语句:SELECT * FROM film LIMIT 100000, 10offset 特别大!这是我司出现很多慢…

C语言最全入门笔记

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&am…

yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口

本文将介绍 YOLOv4 官方 Darknet 实现&#xff0c;如何于 Ubuntu 18.04 编译&#xff0c;及使用 Python 接口。主要内容有&#xff1a;准备基础环境&#xff1a; Nvidia Driver, CUDA, cuDNN, CMake, Python编译应用环境&#xff1a; OpenCV, Darknet用预训练模型进行推断&…

junit测试spring_使用Spring JUnit规则进行参数化集成测试

junit测试springSpring 4.2附带了全新的JUnit规则&#xff1a; SpringClassRule和SpringMethodRule 。 使用JUnit规则的主要优点是让开发人员摆脱SpringJUnit4ClassRunner并在Spring集成测试中利用不同的JUnit运行器。 我认为Spring JUnit Rules的最大机会是易于创建参数化的集…

不属于python的数据类型_下列________不是Python的数据类型。

【判断题】已知 x, y 3, 5,那么执行x, y y, x 之后,x的值为15。【多选题】Python 中对变量描述正确的选项是( )【单选题】字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【多选题】Python的…

无处不在_Java无处不在:使用DukeScript在任何地方运行一次编写

无处不在在相当长一段时间内&#xff0c;Java都未能兑现“一次编写&#xff0c;随处运行”的承诺。 DukeScript希望通过在跨平台应用程序中实现视图和逻辑的清晰分离来改变这种状况。 在本文中&#xff0c;一个简单的场景用于介绍DukeScript的基础。 多年以来&#xff0c;Java…

C语言为何不会过时

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删评价任何一门编程语言&#xff0c;都是招人骂的。永远是这样。就像是春寒料峭的季节&#xff0c; 街上穿棉袄和穿单衣的擦肩而过&#xff0c;双方…

下列选项中不属于python循环语句的是哪一项_下列选项中,不属于字典操作的方法是哪一项?_学小易找答案...

【简答题】字符串有哪几种表现形式?【简答题】简述Python程序的执行过程。【单选题】Python 语句x‘char’;y2,print(xy)输出的结果是哪一项?()【编程题】输入三角形的边长和高,计算并输出三角形的面积。【简答题】手机插上充电器却没有显示充电,可以用万用表检测吗?请上网搜…

mysql 死锁监视器_并发基础知识:死锁和对象监视器

mysql 死锁监视器本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录 …

python ks值计算_利用Python计算KS的实例详解

在金融领域中&#xff0c;我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。sOf免费资源网一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的&#xff0c;KS正好是有效性指标中的区分能力指…

教你如何用一句话激怒IT人

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删在IT行业摸爬滚打这么久&#xff0c;你是否听过下面这些话&#xff1a;“这个很简单&#xff0c;我也是做程序出身的。”“预算砍掉一半&#xf…

java的网络编程有用吗_十大有用但又偏执的Java编程技术

java的网络编程有用吗经过一段时间的编码&#xff08;以我为例&#xff0c;大约20年左右&#xff0c;当您玩得开心时光飞逝&#xff09;&#xff0c;人们开始接受这些习惯。 因为&#xff0c;你知道... 任何可能出错的事情都会发生。 这就是为什么人们会采用“防御性编程”的原…

python bootstrap 4_Python3.4+Django1.9+Bootstrap3

实现和原理Python集成Django开发框架后&#xff0c;可以通过在cmd命令提示符下建立工程&#xff0c;工程名为learn_modelsdjango-admin.py startproject learn_models再进入到learn_models里面&#xff0c;新建一个app项目cd learn_modelspython manage.py startapp learn此时目…

未来五年有颠覆性的IT技术都在这里

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删据福布斯杂志报道&#xff0c;在美国奥兰多举行的Gartner研讨会上&#xff0c;市场研究机构Gartner Research的副总裁兼资深研究员大卫卡利&…