是否有任何基准测试将Java 8 Streams与Guava Iterables进行比较?

Dun*_*gor 16 java performance guava java-8

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

Dun*_*gor 3

我已经在 GitHub 上启动了一个项目来解决这个问题。

Streams 的初步结果令人惊讶地积极 - 对于字符串上的身份映射,2014 MacBookAir 1.7Ghz i7 上的 Java HotSpot(TM) 64 位服务器 VM(内部版本 25.25-b02,混合模式),代码版本https://github.com /dmcg/iterables-v-streams#ea8498ee0627fc59834001a837fa92fba4bcf47ebcf47e

实验选择:
  基准方法:[番石榴、迭代、流]
  工具:[分配、运行时]
  用户参数:{}
  虚拟机:[默认]
  选择类型:完全笛卡尔积

该选择产生 6 个实验。
试验报告(6 中的 1):
  实验{仪器=分配,基准方法=迭代,vm=默认,参数={}}
  结果:
    字节(B):最小值=4072.00,第一部分=4072.00,中位数=4072.00,平均值=4072.00,第三部分=4072.00,最大值=4072.00
    对象:最小值=3.00,第一部分=3.00,中位数=3.00,平均值=3.00,第三部分=3.00,最大值=3.00
试验报告(6 之 2):
  实验{仪器=分配,基准方法=番石榴,vm=默认,参数={}}
  结果:
    字节(B):最小值=15104.00,第一部分=15104.00,中位数=15104.00,平均值=15104.00,第三部分=15104.00,最大值=15104.00
    对象:最小值 = 17.00,第一季度 = 17.00,中位数 = 17.00,平均值 = 17.00,第三季度 = 17.00,最大值 = 17.00
试用报告(第 3 篇,共 6 篇):
  实验{仪器=分配,基准方法=流,vm=默认,参数={}}
  结果:
    字节(B):最小值=15272.00,第一部分=15272.00,中位数=15272.00,平均值=15527.64,第三部分=15432.00,最大值=17252.80
    对象:最小值=20.00,第一季度=20.00,中位数=20.00,平均值=25.00,第三季度=26.00,最大值=53.00
试用报告(第 4 部分,共 6 部分):
  实验{仪器=运行时,基准方法=番石榴,vm=默认,参数={}}
  结果:
    运行时间(ns):最小值=13365.32,第一部分=13660.61,中位数=13802.51,平均值=13961.91,第三部分=14445.46,最大值=14715.34
试用报告(第 5 部分,共 6 部分):
  实验{仪器=运行时,基准方法=迭代,vm=默认,参数={}}
  结果:
    运行时间(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 循环慢不了多少。

  • Caliper 存在正确性问题,例如由于循环展开。[JMH](http://openjdk.java.net/projects/code-tools/jmh) 是首选的基准测试工具。 (2认同)
  • 这是许多缺陷之一,包括消除死代码(因为你不返回值)。Caliper 基于 Bloch 的 [Performance Anxiety](https://www.parleys.com/play/2103)、Click 的 [Art of Benchmarking](http://www.azulsystems.com/events/javaone_2009/session/ 2009_J1_Benchmark.pdf),以及 Android 团队的反馈。参与的人不是虚拟机工程师,它模仿了基本的工具,对于复杂的场景(如线程)毫无用处。对于博客文章和回归健全性检查来说,这是一个更好的默认值,但对于严肃的工作来说却无法使用(例如,Guava 的大部分都是毫无意义的)。 (2认同)