有许许多多关于 Java 8 中流效率的讨论,但根据 Alex Zhitnitsky 的测试结果显示:坚持使用传统的 Java 编程风格——iterator 和 for-each 循环——比 Java 8 的实现性能更佳。

Java 8 中的 Lambda 表达式和流(Stream)受到了热烈欢迎。这是 Java 迄今为止最令人激动的特征。这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能。这些特性如此有趣以至于被认为是不合理的。我们对此表示怀疑,于是决定对这些特性进行测试。

我们创建一个简单的任务:从一个 ArrayList 找出最大值,将传统方式与 Java 8 中的新方式进行测试比较。说实话,测试的结果让我感到非常惊讶。

命令式风格与 Java 8 函数式编程风格比较

我喜欢直接进入主题,所以先看一下结果。为了做这次基准测试,我们先创建了一个 ArrayList,并插入一个 100000 个随机整数,并通过 7 种不同的方式遍历所有的值来查找最大值。实现分为两组:Java 8 中引入的函数式风格与 Java 一直使用的命令式风格。

这是每个方法耗费的时长:

最大错误记录是并行流上的 0.042,完整输出结果在这篇文章结尾部分可以看到。

小贴士:

哇哦!Java 8 中提供的任何一种新方式都会产生约 5 倍的性能差异。有时使用简单迭代器循环比混合 lambda 表达式和流更有效,即便这样需要多写几行代码,且需要跳过甜蜜的语法糖(syntactic suger)。

使用迭代器或 for-each 循环是遍历 ArrayList 最有效的方式,性能比采用索引值的传统 for 循环方式好两倍。

在 Java 8 的方法中,并行流的性能最佳。但是请小心,在某些情况下它也可能会导致程序运行得更慢。

Lambda 表达式的速度介于流与并行流之间。这个结果确实挺令人惊讶的,因为 lambda 表达式的实现方式是基于流的 API 来实现的。

不是所有的情况都如上所示:当我们想演示在 lambda 表达式和流中很容易犯错时,我们收到了很多社区的反馈,要求我们优化基准测试代码,如消除整数的自动装包和解包操作。第二次测试(已优化)的结果在这篇文章结束位置可以看到。

让我们快速看一下每个方法,按照运行速度由快到慢:

命令式风格

iteratorMaxInteger()——使用迭代器遍历列表:

forEachLoopMaxInteger()——不使用迭代器,使用 For-Each 循环遍历列表(不要误用 Java 8 的 forEach)

forMaxInteger()——使用简单的 for 循环和索引遍历列表:

函数式风格

parallelStreamMaxInteger()——使用 Java 8 并行流遍历列表:

lambdaMaxInteger()——使用 lambda 表达式及流遍历列表。优雅的一行代码:

forEachLambdaMaxInteger()——这个用例有点混乱。可能是因为 Java 8 的 forEach 特性有一个很烦人的东西:只能使用 final 变量,所以我们创建一个 final 包装类来解决该问题,这样我们就能访问到更新后的最大值。

顺便提一下,如果要讨论 forEach,我们提供了一些有趣的关于它的缺点的见解,答案参见StackOverflow。

streamMaxInteger()——使用 Java 8 的流遍历列表:

优化后的基准测试

根据这篇文章的反馈,我们创建另一个版本的基准测试。源代码的不同之处可以在这里查看。下面是测试结果:

最后的思考

开始使用 Java 8 的第一件事情是在实践中使用 lambda 表达式和流。但是请记住:它确实非常好,好到可能会让你上瘾!但是,我们也看到了,使用传统迭代器和 for-each 循环的 Java 编程风格比 Java 8 中的新方式性能高很多。

当然,这也不是绝对的。但这确实是一个相当常见的例子,它显示可能会有大约 5 倍的性能差距。如果这影响到系统的核心功能或成为系统一个新的瓶颈,那就相当可怕了。

精通lambda表达式:java多核编程_Java8 Lambda表达式和流操作如何让你的代码变慢5倍...相关推荐

  1. Java8 Lambda表达式和流操作如何让你的代码变慢5倍

    当本文博主也想尝试着去用stream的方式去处理数据,毕竟代码看上去很简洁,很爽,但是,我就写了这么简单的一句: List<DevUsbUpgradeResult> list = inse ...

  2. 精通lambda表达式:Java多核编程pdf

    下载地址:网盘下载 内容简介  · · · · · · lambda表达式权威指南 <精通lambda表达式:Java多核编程>介绍Java SE 8中与lambda相关的特性是如何帮助J ...

  3. Java 函数式编程和 lambda 表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  4. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  5. java网络编程 个人笔记 第二章 流

    java网络编程 个人笔记 第二章 流 流 I/O介绍 java流式输入/输出原理 输入输出流分类 节点流和处理流 节点流的类型 处理流的类型 InputStream(输入流) InputStream ...

  6. Java函数式编程和Lambda表达式

    文章目录 什么是函数式编程 Lambda表达式 @FunctionalInterface函数式接口 Lambda表达式的格式 方法引用 什么是函数式编程 相信大家都使用过面向对象的编程语言,面向对象编 ...

  7. java 8 lambda reduce_[Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化

    好文推荐!!!!! 原文见:http://blog.csdn.net/dm_vincent/article/details/40856569 Java 8中同时存在面向对象编程(OOP)和函数式编程( ...

  8. java 常量 表达式,java – Enum中的常量表达式

    如果可能,修改getIndex()方法,使其返回枚举而不是整数.如果无法做到这一点,则需要将索引映射到枚举元素: 鉴于以下枚举: public enum Index { ONE, TWO, THREE ...

  9. 深度掌握 Java Stream 流操作,让你的代码高出一个逼格

    概念 Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选.排序.聚合等. Stream` 的操作符大体上分为两种:`中间操作符`和`终止操 ...

最新文章

  1. 计算机组成原理判零实验,计算机组成原理实验报告 进位位控制、通用寄存器判零实验...
  2. linux亲和性,两种亲和性
  3. 开始位置 环状图_消防泵房内设备、管网、阀门的设置及系统图
  4. oracle 百万记录 cache,学习笔记:通过案例深入学习In-Memory Database Cache 总结配置过程...
  5. 【Redis】12.Redis删除策略
  6. 【共读Primer】55.[6.4]函数重载--重载与作用域 Page210
  7. C# Socket多线程编程实例
  8. Python进阶_mysql(1)
  9. Python数据结构与算法(1.2)——Python基础之变量与内置数据类型
  10. airpods pro连接安卓声音小_苹果AirPods搭配安卓手机怎么样?那是相当好
  11. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)...
  12. 华为拿下支付牌照 微信、支付宝又迎来一个新对手
  13. WEB渗透测试思维导图
  14. 西北师范大学计算机科学与工程学院导师,西北师范大学计算机科学与工程学院导师简介-陈旺虎...
  15. 计算机表格斜杠怎么打,excel斜杠_excel表格打斜杠的方法步骤详解
  16. qcc304x笔记之长按开关机(四)
  17. unity3d 注册表 Regedit
  18. 我私藏的那些实用的终端命令行工具
  19. unity运行时修改光源的颜色,变成白色
  20. 【单目3D目标检测】MonoDLE论文精读与代码解析

热门文章

  1. 京东排行第一,近 4 万好评,这本 Python 书究竟好在哪?
  2. Facebook 发币 Libra;谷歌十亿美金为穷人造房;第四代树莓派 Raspberry Pi 4 发布 | 开发者周刊...
  3. 5G 和 AI 双驱动,互联网有望迎来第二春
  4. 低头编码的程序员们,你们颈椎不疼吗?
  5. 华为:崛起的 5G 巨龙
  6. 为什么那么多人用“ji32k7au4a83”作密码?
  7. “写代码三年月薪不到一万是不是很失败?”
  8. 卸载抖音,迎接一大波正在路上的“抖音”!
  9. 今日头条、快手们疯狂招人是人工智能的失败?
  10. Tomcat服务器搭建及测试教程(1),腾讯技术官发布的“神仙文档”火爆网络