在Java中测量单线程复杂algorithm的最佳macros基准testing工具/框架是什么?

我想为我的Java代码(一种单线程的本地复杂algorithm)提供一些性能指标(主要是运行时)。 (所以我不想要一个macros基准测量一个JVM实现。)

随着工具,我想

  • 分析复杂性 ,即查看我的代码如何为参数n(search深度)进行缩放。 (我已经有了参数化的junittesting)
  • 做一些趋势分析得到警告,如果代码基地的一些改变使代码变慢。

为此,我想使用一个工具或框架

  • 统计 ,最佳地计算均值,标准差和置信区间。 这个非常重要。
  • 可以参数化 (见上面的参数n)。 这也是非常重要的。
  • 是能够产生花哨的情节会不错,但不是必需的
  • 可以在自动化(junit)testing中用来警告我,如果我的程序慢了,但这也不是必需的,只是一个加号。

哪些工具/框架可以满足这些要求? 哪一个很适合复杂性和趋势分析,为什么?

以下是我find的所有工具的按字母顺序排列的列表。 提到的方面是:

  • 是否容易参数化?
  • 它是一个Java库还是至less可以轻松集成到您的Java程序中
  • 它可以处理JVM微基准testing,例如使用热身阶段
  • 它可以直观地显示结果
  • 它可以持续存储测量值
  • 它可以做趋势分析,警告新的提交导致减速
  • 它是否提供和使用统计(至less是最大值,最小值,平均值和标准偏差)。

自动驾驶

参数化; Perl库; 没有JVM微型基准testing; 绘制; 持久性; 趋势分析!?; 良好的统计数据(运行给定的testing,直到结果稳定;突出显示exception值)。

基准框架

不可参数化; Java库; JVM微型基准testing; 没有阴谋; 没有坚持; 没有趋势分析; 统计。

统计是否非常好:除了平均值,最大值,最小值和标准偏差外,它还计算95%置信区间(通过自举)和序列相关性(例如警告振荡的执行时间,如果程序行为不确定,因为你使用HashSets)。 它决定多长时间一次迭代程序以获得准确的测量结果,并将其解释为报告和警告(例如关于exception值和序列相关性)。

微观基准testing也非常出色(请参阅使用Java创build快速/可靠的基准testing? )。

不幸的是,这个框架带有一个util-package和许多其他的helper-class。 基准类取决于JSci(Java科学API)和Mersenne Twister( http://www.cs.gmu.edu/~sean/research/ )。 如果作者布伦特·博耶(Brent Boyer)find时间,他会把图书馆煮沸并添加一个更简单的graphics,以便用户可以直观地检查测量结果,例如相关性和exception值。

卡尺

参数化; Java库; JVM微型基准testing; 绘制; 持久性; 没有趋势分析; 统计。

相对较新的项目,针对Android应用程序量身打造。 看起来年轻但有前途。 取决于Google Guava 🙁

共同监测

不可参数化! Java库; 没有JVM微型基准testing! 绘制; 通过servlet持久化; 没有趋势分析! 没有统计资料!

支持AOP仪器。

火腿

不可参数化; Java库; 没有JVM微型基准testing; 使用附加工具(Jarep或JMX)进行绘图,持久性和趋势分析; 统计。

良好的监控,与log4j交织在一起,数据也可以以编程方式访问或查询,您的程序可以对结果采取行动。

Java西蒙

不可参数化! Java库; 没有JVM微型基准testing; 只与Jarep密谋; 仅与JMX持久; 没有趋势分析; 没有统计资料!

Jamon的竞争者支持显示器的层次结构。

JETM

不可参数化; Java库; JVM微型基准testing; 绘制; 持久性; 没有趋势分析; 没有统计。

不错的轻量级监控工具,没有依赖性:)不提供足够的统计信息(没有标准差),相应地扩展plugIn看起来相当困难(聚合器和聚合器只有固定的最小,最大和平均获取者)。

JMeter的

参数化!?; java库; 没有JVM微型基准testing! 绘制; 持久性; 趋势分析!?; 统计!?。

良好的监控库,专门针对负载testingWeb应用程序。

Java Microbenchmark线束( jmh

可参数化(通过Java API自定义调用者); Java库; JVM微基准标记; 没有阴谋; 没有坚持; 没有趋势分析; 统计。

由Oracle的HotSpot专家构build的基准testing工具,非常适用于OpenJDK性能工作中使用的HotSpot微基准testing。 采取极端的措施来提供可靠的基准环境。 除了可读的输出之外,jmh还提供了一个Java API来处理结果,例如第三方绘图仪和持久性提供程序。

基于JUnit的基准

参数化; Java库; JVM微型基准testing; 绘制; 持久性(使用CONSOLE,XML或数据库H2); graphics趋势分析; 统计(最大值,最小值,平均值,标准偏差;但对于进一步的统计不容易扩展)。

只需添加一个junit-4规则到你的junittesting:)

junit-Benchmarks是开源的,在Apache 2许可下。

更新 :项目移至jmh

的JUnitPerf

主要用于对性能(使用JUnittesting装饰器TimedTest )和可伸缩性(使用JUnittesting装饰器LoadTest )进行趋势分析。

参数化; Java库; 没有JVM微型基准testing; 没有阴谋; 没有坚持; 没有统计。

的Perf4

不可参数化; Java库; 没有JVM微型基准testing; 绘制; 通过JMX持久化; 通过log4j appender进行趋势分析; 统计。

build立在日志框架上,可以使用AOP。

百老汇项目

非常一般的概念:监视器观察预定义的条件,并指定满足时如何反应。

快速,mcbenchmark

主要关注参数化:检查你的algorithm是否扩展,即检查是否O(n),O(n log(n)),O(n2)…

java库; JVM微型基准testing; 没有阴谋; 持久性; 趋势分析; 没有统计。

磨床

参数化; Jython库; 没有JVM微型基准testing; 绘制; 持久性; 没有趋势分析; 没有好的统计数据,但容易扩展。

取决于Jython,HTTPClient,JEditSyntax,ApacheXMLBeans,PicoContainer。

TPTP

参数化!?; Java工具平台; 没有JVM微型基准testing! 绘制; 持久性; graphics趋势分析; 没有统计!?

testing和性能工具平台是一个巨大的通用和可扩展的工具平台(基于Eclipse和四个EMF模型)。 因此,它是强大的,但相当复杂,可以减慢Eclipse的速度,并根据自己的需要进行扩展(例如统计数据,以便影响迭代次数)似乎非常困难。

Usemon

参数化!?; Java库; 没有JVM微型基准testing; 绘制; 持久性; 趋势分析!?; 统计!?。

工具是针对大型集群中的监控量身定制的。

另一种select是来自谷歌的卡尺 。 它允许参数化testing 。

尝试使用http://labs.carrotsearch.com/junit-benchmarks.html 。 这是JUni4的延伸,特点:

logging执行时间的平均值和标准差。
垃圾收集器活动logging。
每个基准testing的JVM预热阶段。
每运行和历史图表生成。
H2 SQL数据库中的可选结果持久化(高级查询,历史分析)。