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

标签 java monitoring performance

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

7年前关闭。




Improve this question




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

使用该工具,我想

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

  • 为此,我想使用一个工具或框架
  • 统计 ,优化计算平均值、标准偏差和置信区间。这是非常重要的。
  • 参数化 (参见上面的参数 n)。这也是非常重要的。
  • 能够产生一个花哨的情节会很好,但不是必需的
  • 可以在自动化(junit-)测试中使用,以在我的程序执行速度变慢时警告我,但这也不是必需的,只是一个加号。

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

    最佳答案

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

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

  • Auto-pilot

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

    Benchmarking framework

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

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

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

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

    Caliper

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

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

    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

    非常普遍的概念:监视器观察预定义的条件并指定在满足它们时如何 react 。

    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 微基准测试;绘图;坚持;趋势分析!?;统计数据!?。

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

    关于java - 在 Java 中测量单线程复杂算法的最佳宏基准测试工具/框架是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146207/

    相关文章:

    java - 如何在另一个类中使用可运行的jar?

    shell - 如何知道 Puma 中的事件线程数

    c++ - 高效的字符串截断算法,顺序删除相等的前缀和后缀

    mysql - COUNTs 使查询减慢 150+ 次

    c# - 关联 IComMethodEvents

    javascript - 计算扑克牌局赔率

    java - 在 Java 中使用 Selenium 截取包括任务栏的屏幕截图

    java - PayPal Webhook 验证 Java SDK

    java - WebSphere MQ 中的消息组

    java虚拟机: how to log class unloading