【问题标题】:Are there any benchmarks comparing Java 8 Streams to Guava Iterables?有没有比较 Java 8 Streams 和 Guava Iterables 的基准?
【发布时间】:2015-05-04 07:46:58
【问题描述】:

我对 Java 8 上的 Guava 感到非常满意 - 迁移到 Streams 以获取顺序代码是否有任何性能优势或缺陷?

【问题讨论】:

  • 嗯,嗯,你有用例吗?如果是,您可以尝试对这些内容进行微基准测试
  • JIT 已针对 Java 8 中的 Streams 进行了显着优化。即使您不更改代码,您也应该使用 Java 8 JVM。这可能会事半功倍。
  • 我可以嗯,对我的用例进行基准测试,但我更希望看到一些研究来帮助决定在我的磨房代码运行中是默认使用 Streams 还是 Iterables。
  • 请注意,Guava 团队为 Java 8 流的设计做出了贡献,我们通常认为它们优于我们的产品。万岁,前进的步伐!

标签: java performance java-8 guava


【解决方案1】:

我已经开始 a project on GitHub 玩这个了。

Streams 的初始结果出人意料地积极 - 对于字符串上的身份映射,Java HotSpot(TM) 64 位服务器 VM(构建 25.25-b02,混合模式)在 2014 MacBookAir 1.7Ghz i7,代码版本 https://github.com/dmcg/iterables-v-streams#ea8498ee0627fc59834001a837fa92fba4bcf47ebcf47e 实验选择: 基准方法:[番石榴,迭代,流] 仪器:[分配,运行时] 用户参数:{} 虚拟机:[默认] 选择类型:全笛卡尔积 该选择产生 6 个实验。 试验报告 (1 of 6): 实验 {instrument=allocation, benchmarkMethod=iterate, vm=default, parameters={}} 结果: 字节(B):最小=4072.00,第一个队列=4072.00,中位数=4072.00,平均值=4072.00,第三个队列=4072.00,最大=4072.00 对象:min=3.00,1st qu.=3.00,median=3.00,mean=3.00,3rd qu.=3.00,max=3.00 试验报告(2 份,共 6 份): 实验 {instrument=allocation, benchmarkMethod=guava, vm=default, parameters={}} 结果: 字节(B):最小值=15104.00,第一个队列=15104.00,中位数=15104.00,平均值=15104.00,第三个队列=15104.00,最大值=15104.00 对象: min=17.00, 1st qu.=17.00, median=17.00, mean=17.00, 3rd qu.=17.00, max=17.00 试验报告(6 之 3): 实验 {instrument=allocation, benchmarkMethod=streams, vm=default, parameters={}} 结果: 字节(B):最小值=15272.00,第一个队列=15272.00,中位数=15272.00,平均值=15527.64,第三个队列=15432.00,最大值=17252.80 对象:min=20.00, 1st qu.=20.00, median=20.00, mean=25.00, 3rd qu.=26.00, max=53.00 试验报告 (4 of 6): 实验 {instrument=runtime, benchmarkMethod=guava, vm=default, parameters={}} 结果: 运行时间(ns):最小值=13365.32,第一个队列=13660.61,中位数=13802.51,平均值=13961.91,第三个队列=14445.46,最大值=14715.34 试验报告(6 之 5): 实验 {instrument=runtime, benchmarkMethod=iterate, vm=default, parameters={}} 结果: 运行时间(ns):最小值=9952.47,第一个队列=10892.64,中位数=11372.35,平均值=11243.07,第三个队列=11785.48,最大值=12024.76 试验报告(6 之 6): 实验 {instrument=runtime, benchmarkMethod=streams, vm=default, parameters={}} 结果: 运行时间(ns):最小值=10527.26,第一个队列=11051.70,中位数=11747.29,平均值=11631.15,第三个队列=12205.97,最大值=12581.39 从以下位置收集了 81 个测量值: 2 件乐器 2 个虚拟机 3 个基准 执行完成:1.188 分钟。 结果已上传。查看它们:https://microbenchmarks.appspot.com/runs/d2c7f83b-2cfa-4217-ab0b-e8d506eaa85c

我仍然对 Google 卡尺有所了解,但似乎表明 Streams 比 Guava 快,并且比直接 for 循环慢不了多少。

【讨论】:

  • 卡尺存在正确性问题,例如由于循环展开。 JMH 是首选的基准测试工具。
  • 该死的,我认为使用 Google 是安全的。尽管如此,我认为循环展开在这里不会有太大的不同。
  • 这是许多缺陷之一,包括死代码消除(因为您不返回值)。 Caliper 是基于 Bloch 的 Performance Anxiety、Click 的 Art of Benchmarking 的建议以及 Android 团队的反馈。所涉及的不是虚拟机工程师,它模仿了一种基本的线束,对于复杂的场景(如线程)毫无用处。它是博客文章和回归健全性检查的更好默认值,但不适用于严肃的工作(例如,番石榴大多毫无意义)。
  • @BenManes 请问证据如何?例如,在 JMH 中重做 Guava 基准测试,结果明显不同,您如何知道哪一个是“正确”的?
  • @Xaerxess 设计一个公平的单线程基准来发现问题要比诊断一个损坏的基准要困难得多。我对 & 与 && 进行了基准测试,结果产生了不同的赢家。我使用 C++ 作为决胜局,这与 JMH 一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2023-03-19
  • 1970-01-01
  • 2021-08-14
  • 2017-01-14
  • 2015-07-22
  • 1970-01-01
相关资源
最近更新 更多