Java8 Lambda表达式和流操作如何让你的代码变慢5倍
作者:网络转载 发布时间:[ 2015/12/21 10:38:17 ] 推荐标签:测试开发技术 编程语言
顺便提一下,如果要讨论 forEach,我们提供了一些有趣的关于它的缺点的见解,答案参见 StackOverflow。
streamMaxInteger()——使用 Java 8 的流遍历列表:
public int streamMaxInteger() {
Optional max = integers.stream().reduce(Integer::max);
return max.get();
}
优化后的基准测试
根据这篇文章的反馈,我们创建另一个版本的基准测试。源代码的不同之处可以在这里查看。下面是测试结果:
修改总结:
列表不再用 volatile 修饰。
新方法 forMax2 删除对成员变量的访问。
删除 forEachLambda 中的冗余 helper 函数。现在 lambda 表达式作为一个值赋给变量。可读性有所降低,但是速度更快。
消除自动装箱。如果你在 Eclipse 中打开项目的自动装箱警告,旧的代码会有 15 处警告。
优化流代码,在 reduce 前先使用 mapToInt。
非常感谢 Patrick Reinhart, Richard Warburton, Yan Bonnel, Sergey Kuksenko, Jeff Maxwell, Henrik Gustafsson 以及每个 Twitter 上评论的人,感谢你们的贡献。
测试基础
我们使用 JMH(Java Microbenchmarking Harness) 执行基准测试。如果想知道怎么将其应用在你自己的项目中,可以参考这篇文章,我们通过一个自己写的实例来演示 JMH 的主要特性。
基础测试的配置包含 2 个JVM、5 次预热迭代和 5 次测量迭代。该测试运行在 c3.xlarge Amazon EC2 实例上(CPU:4 核,内存:7.5G,存储:2 x 40 GB SSD),采用 Java 8u66 和 JMH 1.11.2。所有的源代码都在 GitHub 上,你可以在这里看到原始的输出结果。
顺便做一下免责申明:基准测试往往不是完全可信的,也很难保证正确。虽然我们试图以准确的方式来运行,但仍然建议接受结果时抱有怀疑的态度。
后的思考
开始使用 Java 8 的第一件事情是在实践中使用 lambda 表达式和流。但是请记住:它确实非常好,好到可能会让你上瘾!但是,我们也看到了,使用传统迭代器和 for-each 循环的 Java 编程风格比 Java 8 中的新方式性能高很多。
当然,这也不是的。但这确实是一个相当常见的例子,它显示可能会有大约 5 倍的性能差距。如果这影响到系统的核心功能或成为系统一个新的瓶颈,那相当可怕了。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11