问题标签 [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.
java - JMH 在基准测试之间挂起(无法杀死分叉的 JVM?)
我有大量的宏基准测试使用不同的执行引擎(其中一些是高度多线程的)来测量各种模拟的执行时间。这些作业中的大多数使用我在抽象基类中指定的 jmh 设置:
(我还将 -gc -si false 添加到命令行)
当我触发这些基准中的任何一个或一些小子集时,它都可以正常工作。但是,如果我尝试一次性运行所有这些(即没有过滤选项),jmh 成功地完成了其中的几个,然后在一个特定的基准测试后突然冻结......完成了它的首字母,打印了最终结果,但是它看起来分叉的 JVM 没有被杀死并且新的没有启动,似乎整个过程都被卡住了。打印的最后一条语句的示例:
如果我手动杀死分叉的 JVM,整个过程就会解除阻塞。然而,在完成下一个基准测试后,它再次陷入困境......任何想法为什么会发生?为什么当我分别启动相同的基准测试时它不会发生?
另外,JMH 中是否有一些超时选项,所以如果正常关闭时间过长,它会强制终止分叉进程?
jmh - 图形+存档
我有两个关于 JMH 的问题:
1)如何从输出中生成图形。我知道我可以输出到 csv/json 并且我知道我可以自己设置一些东西。但如果我不需要自己做的话会很好。
2) 是否有一些开箱即用的存档功能,以便我可以随时间进行性能比较,例如趋势分析。或者可以比较不同 git 分支之间的性能。到目前为止,这个功能看起来并不存在,我需要自己想出一些东西。
java - 使用 JMH 计算指标
如何使用 JMH 计算 CPU 时间和内存量?例如,我有: 代码:
结果:
我可以看到请求时间的数量,测试的平均时间,但看不到平均CPU使用量和内存使用量。这可以通过JMH来完成吗?
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 文件,其中包含有关测试的信息并且运行良好。
所以,问题是我做错了什么?我必须手动编写有关测试的信息吗?
performance - 如何正确和简单地分析scala中的函数?
我正在尝试在 Scala 中反转包含 unicode 字符的字符串。我想找到最快的方法来做到这一点。到目前为止,我有这个代码:
在我的 macbook 2013 上,我得到了以下结果:
但我觉得这些数字是假数字。我应该使用 scala、sbt 和 JMH 库正确地对函数进行基准测试?
注意:正如评论所指出的,Java 中的微基准测试是一项严肃的业务,请参阅(如何在 Java 中编写正确的微基准?)和https://groups.google.com/d/msg/mechanical-sympathy /m4opvy4xq3U/7lY8x8SvHgwJ。为什么你不应该尝试在不使用外部库的情况下进行微基准测试。
scala - 如何将 JMH 与 sbt 一起用于 Scala 基准测试?
我曾尝试将jmh与sbt一起使用,但到目前为止,我还没有设法正确设置它,以便基于 .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 的基准测试?
java - Java Microbenchmarking Harness vs System.getNanotime()
问题1:为什么JMH
比简单更好System.getNanotime()
?
问题 2:我可以从结果中得出什么结论(看benchmarking results
部分)除了validateLongKeyBinary
比 快 64%validateLongKeyAscii
吗?
示例(代码):
基准测试结果
java - 如何指定 JMH 微基准测试在不使用资源文件的情况下运行?
0.6. 我有 jmh-core、jmh-generator-annprocess、jmh-generator-reflection 作为依赖项。
首先,不幸的是,文档很差。一方面,我使用 gradle,而不是 maven,所以使用 maven 原型不是一个选项。
其次,我想使用 Java API,而不是命令行。
我非常简单的代码是:
因为我没有.include()
,所以它意味着.*
作为正则表达式,因此所有基准。这是我项目中唯一的课程。
但没有:“没有找到基准”。
因此,作为最后的手段,我尝试META-INF/MicroBenchmarks
按照其他地方的建议创建文件;内容,类名:
但它也不起作用:
当然,这个文件的格式没有记录。
但我不想用这个文件开始;我想指定要运行的类列表。
我怎么做?
java - JMH AnnotationProcessor NullPointerException
我创建了 JMH 主页中指定的 maven 原型项目。当我对生成的项目进行 maven 构建时,我收到“注释生成器抛出异常。java.lang.NullPointerException”。我的java文件是
`。我得到的例外是
java - 为什么 Java 7 中的 StringBuilder#append(int) 比 Java 8 更快?
在调查使用整数原语并将整数原语转换为字符串的小辩论时,我编写了这个JMH 微基准测试:"" + n
Integer.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
文件中的源代码和StringBuilder
类Integer
的并排比较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 源代码相关部分的人必须回答这些问题......