在Java中测量单线程复杂算法的最佳宏基准测试工具/框架是什么?

Dav*_*Far 53 java performance monitoring

我想为我的Java代码(一种单线程,本地,复杂的算法)制定一些性能测量(主要是运行时).(所以我不想要宏基准来衡量JVM实现.)

有了这个工具,我想

  • 分析复杂性,即查看我的代码如何缩放参数n(搜索深度).(我已经在n中进行了参数化的junit测试.)
  • 如果某些代码库的更改会使代码变慢,请进行一些趋势分析以获得警告.

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

  • 进行统计,最优地计算平均值,标准差和置信区间.这是非常重要的.
  • 可以参数化(参见上面的参数n).这也很重要.
  • 能够制作花哨的情节会很好,但不是必需的
  • 可用于自动(junit-)测试,以警告我,如果我的程序运行缓慢,但这也不是必需的,只是一个加号.

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

Dav*_*Far 67

下面是我找到的所有工具的字母顺序列表.提到的方面是:

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

自动驾驶

参数化; Perl库; 没有JVM微基准测试; 绘制; 持久性; 趋势分析!?; 良好的统计数据(运行给定的测试直到结果稳定;突出异常值).

基准框架

不可参数化; Java库; JVM微基准测试; 没有密谋; 没有坚持; 没有趋势分析; 统计.

统计数据是否非常好:除了平均值,最大值,最小值和标准差之外,它还计算95%置信区间(通过自举)和串行相关(例如,警告振荡执行时间,如果您的程序行为不确定,可能会发生,例如,因为你使用HashSets).它决定程序必须迭代以获得准确测量的频率,并将其解释为报告和警告(例如关于异常值和序列相关性).

微基准测试也非常好(有关详细信息,请参阅使用java创建快速/可靠的基准测试).

不幸的是,该框架包含一个与许多其他帮助程序类捆绑在一起的util-package.基准类依赖于JSci(Java的科学API)和Mersenne Twister(http://www.cs.gmu.edu/~sean/research/).如果作者Brent Boyer找到时间,他会将库煮沸并添加一个更简单的图示器,以便用户可以直观地检查测量结果,例如相关性和异常值.

卡尺

参数化; Java库; JVM微基准测试; 绘制; 持久性; 没有趋势分析; 统计.

相对较新的项目,针对Android应用程序量身定制.看起来年轻但前途无量 取决于谷歌番石榴:(

公共监督

不可参数化!?; Java库; 没有JVM微基准测试!?; 绘制; 通过servlet持久化; 没有趋势分析!?; 没有统计数据!?

支持AOP仪器.

火腿

不可参数化; Java库; 没有JVM微基准测试; 使用其他工具绘制绘图,持久性和趋势分析(Jarep或JMX); 统计.

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

Java西蒙

不可参数化!?; Java库; 没有JVM微基准测试; 仅与Jarep密谋; 仅使用JMX持久化; 没有趋势分析; 没有统计数据!?

Jamon的竞争对手,支持监视器的层次结构.

JETM

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

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

JMeter的

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

良好的监控库,适用于负载测试Web应用程序.

Java Microbenchmark线束(jmh)

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

由Oracle HotSpot专家构建的基准测试工具非常适合在HotJot上进行微基准测试,用于OpenJDK性能工作.采取了极端措施来提供可靠的基准测试环境.除了人类可读的输出外,jmh还提供了一个Java API来处理结果,例如第三方绘图仪和持久性提供程序.

基于JUnit的基准

参数化; Java库; JVM微基准测试; 绘制; 持久性(使用CONSOLE,XML或数据库H2); 图形趋势分析; 统计数据(最大值,最小值,平均值,标准差;但不能轻易扩展以进一步统计).

只需在junit测试中添加junit-4规则:)

junit-Benchmarks是Apache 2许可下的开源.

更新:项目移至jmh

的JUnitPerf

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

参数化; Java库; 没有JVM微基准测试; 没有密谋; 没有坚持; 没有统计数据

的Perf4

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

构建日志框架,可以使用AOP.

百老汇项目

非常一般的概念:监视器观察预定义的条件并指定满足它们时的反应方式.

快速,mcbenchmark

主要关注参数化:检查算法是否可扩展,即检查它是否为O(n),O(n log(n)),O(n²)......

java库; JVM微基准测试; 没有密谋; 持久性; 趋势分析; 没有统计数据

磨床

参数化; Jython图书馆; 没有JVM微基准测试; 绘制; 持久性; 没有趋势分析; 没有好的统计数据,但很容易扩展.

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

TPTP

参数化!?; Java工具平台; 没有JVM微基准测试!?; 绘制; 持久性; 图形趋势分析; 没有统计数据!?

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

Usemon

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

工具适用于大型集群中的监控.


sbr*_*ges 9

另一种选择是来自谷歌的卡尺.它允许参数化测试.


Ula*_*kar 7

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

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

  • 根据 [junit-benchmarks](http://labs.carrotsearch.com/junit-benchmarks.html) 主页:“该项目已被弃用,取而代之的是 [JMH](http://openjdk.java.net/项目/代码工具/jmh/)。” (2认同)