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

2024-01-09

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

有了这个工具,我想

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

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

  • 是否统计数据,最优计算平均值、标准差和置信区间。这个非常重要。
  • can be 参数化的(参见上面的参数 n)。这也是非常重要的。
  • 能够产生一个奇特的情节会很好,但不是必需的
  • 可以在自动化(junit-)测试中使用,以警告我如果我的程序运行速度变慢,但这也不是必需的,只是一个优点。

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


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

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

自动驾驶仪 http://tcos.org/project-autopilot.html

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

基准测试框架 http://www.ellipticgroup.com/misc/projectLibrary.zip

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

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

微基准测试也非常好(参见使用 java 创建快速/可靠的基准测试? https://stackoverflow.com/questions/6373550/create-quick-reliable-benchmark-with-java/7120803#7120803了解详情)。

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

Caliper http://code.google.com/p/caliper/

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

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

公共监控 http://commons.apache.org/sandbox/monitoring/

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

支持 AOP 检测。

JAMon http://jamonapi.sourceforge.net/

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

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

爪哇西蒙 https://github.com/virgo47/javasimon

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

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

JETM http://jetm.void.fm/index.html

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

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

jmeter http://jakarta.apache.org/jmeter/

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

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

Java 微基准测试工具 (jmh) http://openjdk.java.net/projects/code-tools/jmh/

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

由 Oracle HotSpot 专家构建的基准测试工具,非常适合在 OpenJDK 性能工作中使用的 HotSpot 微基准测试。我们采取了极端措施来提供可靠的基准测试环境。除了人类可读的输出之外,jmh 还提供 Java API 来处理结果,例如对于第三方绘图者和持久性提供者。

junit-基准测试 http://labs.carrotsearch.com/junit-benchmarks.html

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

只需将 junit-4-rule 添加到您的 junit 测试中即可:)

junit-Benchmarks 是开源的,遵循 Apache 2 许可证。

Update: 项目移至jmh http://openjdk.java.net/projects/code-tools/jmh/

朱尼特珀夫 http://clarkware.com/software/JUnitPerf.html

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

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

perf4j http://perf4j.codehaus.org/

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

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

百老汇计划 http://code.google.com/p/broadway-monitor/

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

快速 mcbenchmark http://code.google.com/p/speedy-mcbenchmark/

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

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

研磨机 http://grinder.sourceforge.net/

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

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

TPTP http://www.eclipse.org/tptp/

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

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

Usemon http://code.google.com/p/usemon/

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

该工具专为大型集群中的监控而定制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

衡量 Java 中单线程复杂算法的最佳宏观基准测试工具/框架是什么? [关闭] 的相关文章

  • CompletableFuture:几个任务

    如何使用 5 个 CompletableFutures 异步执行 20 个 Runnable 任务 或 1 个任务 20 次 这就是我所拥有的 Runnable task gt long startTime System currentTi
  • 如何在servlet 3.0的web.xml-less中定义

    我有现有的 web 应用程序 我想将其转换为 servlet 3 0 的 web xml less 我已经设法让它工作 但是 web xml 中有 2 个标签 我仍然不知道无 web xml 环境中的等效代码
  • Play 2.4,错误:包play.*不存在

    我想开始使用 play 框架 2 4 4 并想遵循教程 我正在关注这个 YouTube 视频 https www youtube com watch v bLrmnjPQsZc从他们的网站 使用 play java 模板并将其导入 Inte
  • 对 Java 安全性和 BouncyCastle API 感到茫然和困惑

    我一直在尝试理解 Java 的 BouncyCastle 加密 API 不幸的是 我发现 Java 密码学总体上被服务提供者接口和术语所掩盖 以至于我无法理解任何东西的实际作用 我已经尝试反复阅读必要的文档 但它仍然难以理解 引入了许多远远
  • 将 1GB 文件的内容流式传输到单列下的 sqlite 表

    下面的实现给出了具有 4 GB 堆空间的 1 GB 大小的文件的内存不足错误 Files lines 将返回一个流 但在运行 Collectors joining 时会出现堆错误 我们可以使用 jooq 和 jdbc 保留原始行分隔符来流式
  • 您无权访问此服务器上的 /schema/beans/spring-beans-3.1.xsd

    我在我的一个应用程序中使用 spring 框架 到目前为止一切正常 但是今天早上 当我尝试运行我的应用程序时 它抛出错误 因为无法初始化 spring 框架 因此 我尝试在浏览器中加载 xsd 文件 但徒劳无功 因为它向我显示了禁止的页面
  • 是否有用于运行测试组的 JUnit TestRunner?

    我目前正在使用 JUnit 4 并且需要将我的测试分为可以以任意组合有选择地运行的组 我知道 TestNG 具有注释测试以将它们分配到组的功能 但我现在无法迁移到 TestNG 看来这可以通过一些自定义注释和自定义 JUnit TestRu
  • PowerMock,模拟静态方法,然后对所有其他静态调用真实方法

    我正在设置模拟类的静态方法 我必须在 Before 带注释的 JUnit 设置方法 我的目标是设置类来调用真正的方法 except对于那些我明确嘲笑的方法 基本上 Before public void setupStaticUtil Pow
  • 如何使用 spring data jpa 调用数据库函数?

    我想从 Spring Boot 应用程序调用数据库函数 该函数将返回解密的值 是否可以使用spring data jpa调用数据库函数 如果可以的话怎么办 如果无法使用 spring data jpa 是否有其他方法可以从 Spring B
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • 如何提高 Field.set 的性能(也许使用 MethodHandles)?

    我正在编写一些调用的代码Field set https docs oracle com en java javase 11 docs api java base java lang reflect Field html set java l
  • 如何解决找不到 com.google.cloud.Service 的类文件

    我正在尝试将 JSON 数据上传到 gcs 由于我之前没有使用谷歌云 所以我开始将随机字符串上传到 gcs 但在创建存储服务对象时我陷入了困境 Maven 依赖
  • Java字符串模式识别

    我有一个大约一千个字符长的字符串 由 L T 和 A 组成 我很确定其中有一个简单的模式 我想知道是否有任何快速简便的方法可以找到它 该字符串会发生变化 因此这不仅仅是一次性的 我正在寻找的模式例如如果字符串是 LLLLLLLLAATAAL
  • 亚马逊 AWS Java API。我看不到我的 AMI

    我正在使用 Amazon AWS 的 Java API 我成功进行了身份验证 然后获取了所有图像 但我的图像不在其中 我的 AMI 是私有的 但我想自从我经过身份验证后我仍然会看到它们 这是我的来源 final AmazonEC2 clie
  • 如何在java中模拟SHIFT+鼠标按键

    我想将鼠标指针移动到特定位置并执行 SHIFT 鼠标右键单击 我可以将鼠标移动到某个位置 但无法模拟鼠标单击 Robot r new Robot r mouseMove x1 y1 我应该做什么来模拟预期的鼠标点击 我认为您只需要一点额外的
  • 与嵌套泛型集合的混淆

    请帮助我理解为什么add1 and add4 报告错误以及原因add2 and add3 不 具体来说 请举例说明如果编译器允许其中每一个进行编译 则会产生不良后果的示例 class InnerTypeConfusion interface
  • Android:上下文是否影响用于取消警报的filterEquals()?

    要取消闹钟 我使用alarmManager cancel pendingIntent 根据 Android 开发者的说法Removes any alarms with a matching Intent Any alarm of any t
  • 扩展 Lombok 困难

    我想创建一个注释处理程序来扩展 Java 语言 然而 由于 SCL 文件的原因 我无法轻松做到这一点 我想知道 Lombok 开发人员是否故意让它变得如此困难 如果我尝试扩展 JavacAnnotationHandler 它无法在 lomb
  • 用于只读 DB 的 java ORM

    我了解 hibernate 但我想知道是否有一个更轻的 ORM 引擎只读数据库 我的意思是 我不需要一些事务查询或更新一些记录 另一方面 我需要处理一些大的记录列表 List
  • 没有 WindowManager.LayoutParams.TYPE_PHONE 的粘性覆盖

    我所说的粘性是指一个不会通过调用启动器意图而关闭的窗口 intent addCategory Intent CATEGORY HOME 以前这是用完成的WindowManager LayoutParams TYPE PHONE 但此类型现已

随机推荐