问题标签 [jmh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1876 浏览

java - JMH 在基准测试之间挂起(无法杀死分叉的 JVM?)

我有大量的宏基准测试使用不同的执行引擎(其中一些是高度多线程的)来测量各种模拟的执行时间。这些作业中的大多数使用我在抽象基类中指定的 jmh 设置:

(我还将 -gc -si false 添加到命令行)

当我触发这些基准中的任何一个或一些小子集时,它都可以正常工作。但是,如果我尝试一次性运行所有这些(即没有过滤选项),jmh 成功地完成了其中的几个,然后在一个特定的基准测试后突然冻结......完成了它的首字母,打印了最终结果,但是它看起来分叉的 JVM 没有被杀死并且新的没有启动,似乎整个过程都被卡住了。打印的最后一条语句的示例:

如果我手动杀死分叉的 JVM,整个过程就会解除阻塞。然而,在完成下一个基准测试后,它再次陷入困境......任何想法为什么会发生?为什么当我分别启动相同的基准测试时它不会发生?

另外,JMH 中是否有一些超时选项,所以如果正常关闭时间过长,它会强制终止分叉进程?

0 投票
1 回答
170 浏览

jmh - 图形+存档

我有两个关于 JMH 的问题:

1)如何从输出中生成图形。我知道我可以输出到 csv/json 并且我知道我可以自己设置一些东西。但如果我不需要自己做的话会很好。

2) 是否有一些开箱即用的存档功能,以便我可以随时间进行性能比较,例如趋势分析。或者可以比较不同 git 分支之间的性能。到目前为止,这个功能看起来并不存在,我需要自己想出一些东西。

0 投票
1 回答
5948 浏览

java - 使用 JMH 计算指标

如何使用 JMH 计算 CPU 时间和内存量?例如,我有: 代码:

结果:

我可以看到请求时间的数量,测试的平均时间,但看不到平均CPU使用量和内存使用量。这可以通过JMH来完成吗?

0 投票
1 回答
3287 浏览

java - 在 Intellij IDEA 中运行 JMH 示例时的空基准

我在使用 JMH 时遇到了一些问题。

因此,我在 Intellij Idea 中创建了一个空项目,然后在项目结构中添加jmh-core jar 文件。最后,尝试运行示例,例如

但结果是

随着使用verbosity(VerboseMode.EXTRA)

我试图将输出路径更改为projectFolder\target\classes但没有任何改变。然后我在调试模式下查看了源代码,发现resource = "/META-INF/MicroBenchmarks",urls.hasMoreElements()是假的,因此benchmarks是空的。然后我看到了示例 jar 文件,其中包含 MicroBenchmarks 文件,其中包含有关测试的信息并且运行良好。

所以,问题是我做错了什么?我必须手动编写有关测试的信息吗?

0 投票
1 回答
689 浏览

performance - 如何正确和简单地分析scala中的函数?

我正在尝试在 Scala 中反转包含 unicode 字符的字符串。我想找到最快的方法来做到这一点。到目前为止,我有这个代码:

在我的 macbook 2013 上,我得到了以下结果:

但我觉得这些数字是假数字。我应该使用 scala、sbt 和 JMH 库正确地对函数进行基准测试?

注意:正如评论所指出的,Java 中的微基准测试是一项严肃的业务,请参阅(如何在 Java 中编写正确的微基准?)和https://groups.google.com/d/msg/mechanical-sympathy /m4opvy4xq3U/7lY8x8SvHgwJ。为什么你不应该尝试在不使用外部库的情况下进行微基准测试。

0 投票
1 回答
3940 浏览

scala - 如何将 JMH 与 sbt 一起用于 Scala 基准测试?

我曾尝试将一起使用,但到目前为止,我还没有设法正确设置它,以便基于 .scala 的基准测试工作。

由于基于 sbt + .java 的组合基准测试有效,我尝试从该基础开始。我正在使用 sbt 0.13.1。


使用 sbt 的基于 .java 的基准测试

构建.sbt

最后要获得一个“胖”罐子,需要sbt-assembly插件:

项目/程序集.sbt

一个简单的基准:

src/main/java/app/benchmark/java/benchmark2/Benchmark2.java

运行sbt assembly给出以下输出:

$ sbt assembly
[...]
[info] 将 2 个 Scala 源和 2 个 Java 源编译为 ...
[warn] 警告:来自注释处理器 'org.openjdk.jmh.generators.GenerateMicroBenchmarkProcessor' 的支持的源版本 'RELEASE_6' 小于-source '1.8'
[warn] 1 warning
[info] 包括:jmh-java-benchmark-archetype-0.5.5.jar
[info] 包括:jmh-generator-bytecode-0.5.5.jar
[info] 包括:jopt -simple-4.6.jar
[info] 包括:jmh-generator-reflection-0.5.5.jar
[info] 包括:jmh-generator-annprocess-0.5.5.jar
[info] 包括:asm-4.2.jar
[info ] 包括:commons-math3-3.2.jar
[信息] 包括:jmh-core-0.5.5.jar
[info] 包括:scala-library.jar
[...]
[info] 打包 /home/scala-2.10/vc/rhaag/scala/scala-benchmark/target/scala-2.10/microbenchmarks.jar ...

结果microbenchmarks.jar包含运行基准测试所需的一切:

到目前为止,一切都很好。


使用 sbt 进行 Scala 基准测试

从那个基础我尝试切换到基于 .scala 的基准测试:

构建.sbt

用 Scala 替换 Java 原型

不起作用,因为下载失败。

这有效:

另一个简单的基准:

src/main/scala/app/benchmark/scala/benchmark2/Benchmark2.scala

现在sbt assembly创建 jar 文件,但target/scala-2.10/microbenchmarks.jar#META-INF/MicroBenchmarks没有列出 Scala 基准,并且这些也没有显示java -jar target/scala-2.10/microbenchmarks.jar -l


资源:

如何为 Scala 集成(基于字节码的)JMH 处理器?或者从另一个角度来看:为什么(基于注释的)JMH 处理器会自动启动并生成基于 Java 的基准测试?

0 投票
1 回答
944 浏览

java - Java Microbenchmarking Harness vs System.getNanotime()

问题1:为什么JMH比简单更好System.getNanotime()

问题 2:我可以从结果中得出什么结论(看benchmarking results部分)除了validateLongKeyBinary比 快 64%validateLongKeyAscii吗?

示例(代码):

基准测试结果

0 投票
2 回答
5879 浏览

java - 如何指定 JMH 微基准测试在不使用资源文件的情况下运行?

0.6. 我有 jmh-core、jmh-generator-annprocess、jmh-generator-reflection 作为依赖项。

首先,不幸的是,文档很差。一方面,我使用 gradle,而不是 maven,所以使用 maven 原型不是一个选项。

其次,我想使用 Java API,而不是命令行。

我非常简单的代码是:

因为我没有.include(),所以它意味着.*作为正则表达式,因此所有基准。这是我项目中唯一的课程。

但没有:“没有找到基准”。

因此,作为最后的手段,我尝试META-INF/MicroBenchmarks按照其他地方的建议创建文件;内容,类名:

但它也不起作用:

当然,这个文件的格式没有记录。

但我不想用这个文件开始;我想指定要运行的类列表。

我怎么做?

0 投票
1 回答
902 浏览

java - JMH AnnotationProcessor NullPointerException

我创建了 JMH 主页中指定的 maven 原型项目。当我对生成的项目进行 maven 构建时,我收到“注释生成器抛出异常。java.lang.NullPointerException”。我的java文件是

`。我得到的例外是

0 投票
2 回答
10399 浏览

java - 为什么 Java 7 中的 StringBuilder#append(int) 比 Java 8 更快?

在调查使用整数原语并将整数原语转换为字符串的小辩论时,我编写了这个JMH 微基准测试:"" + nInteger.toString(int)

我使用 Linux 机器上存在的两个 Java VM(最新的 Mageia 4 64 位、Intel i7-3770 CPU、32GB RAM)使用默认的 JMH 选项运行它。第一个 JVM 是随 Oracle JDK 8u5 64 位提供的:

有了这个 JVM,我几乎得到了我的预期:

即,StringBuilder由于创建StringBuilder对象和附加空字符串的额外开销,使用类更慢。使用String.format(String, ...)速度甚至更慢,大约一个数量级。

另一方面,发行版提供的编译器基于 OpenJDK 1.7:

这里的结果很有趣

为什么StringBuilder.append(int)使用这个 JVM 看起来要快得多?查看StringBuilder类源代码并没有发现什么特别有趣的东西 - 所讨论的方法几乎与Integer#toString(int). 有趣的是,附加Integer.toString(int)stringBuilder2微基准)的结果似乎并没有更快。

这种性能差异是测试工具的问题吗?或者我的 OpenJDK JVM 是否包含会影响此特定代码(反)模式的优化?

编辑:

为了进行更直接的比较,我安装了 Oracle JDK 1.7u55:

结果与 OpenJDK 类似:

这似乎是一个更普遍的 Java 7 vs Java 8 问题。也许 Java 7 有更积极的字符串优化?

编辑 2

为了完整起见,以下是这两个 JVM 的与字符串相关的 VM 选项:

对于 Oracle JDK 8u5:

对于 OpenJDK 1.7:

UseStringCache选项在 Java 8 中被删除,没有替换,所以我怀疑这有什么不同。其余选项似乎具有相同的设置。

编辑 3:

AbstractStringBuilder文件中的源代码和StringBuilderInteger的并排比较src.zip显示没有什么值得注意的。除了大量的外观和文档更改之外,Integer现在还支持无符号整数,StringBuilder并且经过轻微重构以与StringBuffer. 这些更改似乎都不会影响 使用的代码路径StringBuilder#append(int),尽管我可能遗漏了一些东西。

IntStr#integerToString()为和生成的汇编代码的比较IntStr#stringBuilder0()更有趣。为这两个 JVM生成的代码的基本布局IntStr#integerToString()是相似的,尽管 Oracle JDK 8u5 似乎更积极地在Integer#toString(int)代码中内联了一些调用。与 Java 源代码有明确的对应关系,即使对于装配经验很少的人也是如此。

然而,的汇编代码IntStr#stringBuilder0()完全不同。Oracle JDK 8u5 生成的代码再次与 Java 源代码直接相关——我可以很容易地识别出相同的布局。相反,OpenJDK 7 生成的代码对于未经训练的眼睛(就像我的眼睛)几乎无法识别。该new StringBuilder()调用似乎已被删除,就像在StringBuilder构造函数中创建数组一样。此外,反汇编插件无法像在 JDK 8 中那样提供对源代码的引用。

StringBuilder我认为这要么是 OpenJDK 7 中更积极的优化传递的结果,要么更可能是为某些操作插入手写的低级代码的结果。我不确定为什么在我的 JVM 8 实现中没有发生这种优化,或者为什么Integer#toString(int)在 JVM 7 中没有实现相同的优化。我想熟悉 JRE 源代码相关部分的人必须回答这些问题......