用 Java 衡量单线程复杂算法的最佳宏基准测试工具/框架是啥? [关闭]

Posted

技术标签:

【中文标题】用 Java 衡量单线程复杂算法的最佳宏基准测试工具/框架是啥? [关闭]【英文标题】:What is the best macro-benchmarking tool / framework to measure a single-threaded complex algorithm in Java? [closed]用 Java 衡量单线程复杂算法的最佳宏基准测试工具/框架是什么? [关闭] 【发布时间】:2011-11-01 01:14:24 【问题描述】:

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

有了这个工具,我想

分析复杂性,即查看我的代码如何针对参数 n(搜索深度)进行缩放。 (我已经在 n 中参数化了一个 junit 测试。) 进行一些趋势分析,如果代码库的某些更改导致代码变慢,则会收到警告。

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

进行统计,优化计算平均值、标准差和置信区间。这非常重要。 可以参数化(参见上面的参数n)。这也很重要。 能够制作精美的情节会很好,但不是必需的 可以在自动化(junit-)测试中使用,以在我的程序运行速度变慢时向我发出警告,但这也不是必需的,只是一个加分项。

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

【问题讨论】:

目前还没有标签“macrobenchmark”(虽然有 microbenchmark)。请问有足够权限的人可以加这个标签吗? 看看:jetm.void.fm/index.html 感谢 khmarbaise,我刚刚开始使用 JETM,因为它非常轻量级,但仍然提供了许多我想要的想法。不幸的是,统计数据相当薄弱,但也许我可以添加一个插件来改进它。 我在 day-to-day-stuff.blogspot.com/2009/01/… 找到了一篇关于 Java 运行时监控库的博客条目。它涵盖 Jamon、Java Simon、Usemon、Moskito、Commons 监控、JETM 和 Project Broadway。但是对于每个工具,只给出了一个非常简短的摘要。 JETM 对于更复杂的统计结果似乎不容易扩展:提供结果的 Aggregate 接口固定为特定值(getAverage、getMax、getMin)。所以扩展必须渗透到整个库:( 【参考方案1】:

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

是否易于参数化 它是 Java 库还是至少可以轻松集成到您的 Java 程序中 它可以处理 JVM 微基准测试吗?使用热身阶段 它可以直观地绘制结果 是否可以永久存储测量值 它能否进行趋势分析以警告新提交导致速度变慢 它是否提供和使用统计数据(至少是最大值、最小值、平均值和标准差)。

Auto-pilot

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

Benchmarking framework

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

统计数据非常好:除了平均值、最大值、最小值和标准偏差之外,它还计算 95% 置信区间(通过自举)和序列相关性(例如,警告振荡的执行时间,如果您的程序运行时可能会发生这种情况不确定性,例如因为您使用 HashSets)。它决定了程序必须多久迭代一次才能获得准确的测量结果,并解释这些结果以进行报告和警告(例如关于异常值和序列相关性)。

微基准测试也做得非常好(详见Create quick/reliable benchmark with java?)。

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

Caliper

可参数化; Java库; JVM微基准测试;绘图;坚持;没有趋势分析;统计数据。

相对较新的项目,专为 android 应用量身定制。看起来年轻但很有前途。取决于谷歌番石榴:(

Commons monitoring

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

支持 AOP 检测。

JAMon

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

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

Java Simon

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

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

JETM

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

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

jmeter

参数化!?; java库;没有 JVM 微基准测试!?绘图;坚持;趋势分析!?;统计数据!?。

为负载测试 Web 应用程序量身定制的良好监控库。

Java Microbenchmark Harness (jmh)

参数化(通过 Java API 自定义调用程序); Java库; JVM微基准测试;没有地块;没有坚持;没有趋势分析;统计数据。

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

junit-Benchmarks

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

只需在您的 junit 测试中添加一个 junit-4-rule :)

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

更新:项目移至jmh

junitperf

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

可参数化; Java库;没有 JVM 微基准测试;没有绘图;没有坚持;没有统计数据。

perf4j

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

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

Project Broadway

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

speedy-mcbenchmark

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

java 库; JVM微基准测试;没有绘图;坚持;趋势分析;没有统计数据。

The Grinder

可参数化; Jython 库;没有 JVM 微基准测试;绘图;坚持;没有趋势分析;没有好的统计数据,但很容易扩展。

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

TPTP

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

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

Usemon

参数化!?; Java库;没有 JVM 微基准测试;绘图;坚持;趋势分析!?;统计数据!?。

工具专为在大型集群中进行监控而量身定制。

【讨论】:

看起来像 junit-benchmarks is actually open source, under the Apache 2 licence.. JMH:“但是,它确实专注于较低的基准,并遵循与经验主义不同的范式。” ——这是什么意思? @Aleksey,我正在查看 jmh 示例,并得到了仅进行一次测量的表达式。因此,我得出结论,它遵循与重复某些测量并获取平均值和其他统计数据的其他工具不同的范式。能否提供 jmh 统计功能的链接? @Aleksey:我理解并正确地修改了你的最后一句话吗? “被处理器消费”是什么意思? hg.openjdk.java.net/code-tools/jmh/file/c2af91629c91/…, "基准测试方法的约定非常简单:使用@GenerateMicroBenchmark 对其进行注释,然后您就可以开始了。JMH 将运行测试通过不断调用此方法,并衡量其执行的性能指标。”【参考方案2】:

另一种选择是来自谷歌的caliper。它允许parameterized testing。

【讨论】:

【参考方案3】:

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

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

【讨论】:

一个用于标记的junit规则,它也计算标准偏差-我喜欢它(-> +1)。让我们看看它是否可以做进一步的统计(例如,决定测量多少轮来确定某个置信度)或者以这种方式轻松扩展...... @Ula Krukar - 这个框架最好的地方在于它与现有的 JUnit 测试无缝集成。 Caliper 或 JunitPerf 没有为我整理出来。 +1 如果它只有 CSV 输出 - 我宁愿自己绘制结果。我想写一个不难...... 根据junit-benchmarks主页:“该项目已被JMH弃用。”

以上是关于用 Java 衡量单线程复杂算法的最佳宏基准测试工具/框架是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

阿里P8架构师详解Java性能调优策略

《趣学算法》,陈小玉

STREAM 内存带宽基准测试真正衡量的是啥?

.Net Core 2.2与Java 12性能对比

java数据结构知识点自我总结

是否可以强制现有 Java 应用程序使用不超过 x 个内核?