问题标签 [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 编写一个小的 getbytes 基准?
我是 JMH 和基准测试的新手。我写了一个 public byte[]getBytes(String charsetName) 方法的小测试。但是 Maven 无法构建。这是我的代码:
当我运行时: mvn clean install。我收到一条构建失败错误消息。
java - jmh 测试是否仅在热点上运行?
如何设置 jmh 参数以便在不同的虚拟机上运行测试?
我试图将 -jvm //path 更改为虚拟机。
我收到此错误:
java - jmh中的操作是什么意思?
在 jmh 结果中,分数以 ns/op 为单位,每次操作花费的时间以纳秒为单位,操作是指基准调用吗?如果是这种情况,较低的分数将意味着更快的呼叫?
java - 为什么用于斐波那契计算的简单 Scala tailrec 循环比 Java 循环快 3 倍?
斯卡拉
代码:
字节码:
结果是53879289.462 ± 6289454.961 ops/s
:
https://travis-ci.org/plokhotnyuk/scala-vs-java/jobs/56117116#L2909
爪哇
代码:
字节码:
结果是17444340.812 ± 9508030.117 ops/s
:
https://travis-ci.org/plokhotnyuk/scala-vs-java/jobs/56117116#L2881
是的,这取决于环境参数(JDK 版本、CPU 型号和 RAM 频率)和动态状态。但是为什么在同一环境中大多数相同的字节码可以为函数参数范围产生稳定的 2x-3x 差异?
这是我的笔记本电脑中不同函数参数值的 ops/s 编号列表,配备 Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz(最大 3.50GHz)、RAM 12Gb DDR3-1333、Ubuntu 14.10、Oracle JDK 1.8.0_40-b25 64 位:
另一个问题是“为什么 ops/s 的值会像上面那样以非线性方式减少?”
java - 是什么导致 jmh 测量中的误差?
我想知道在 jmh 测试的分数结果中有误差的可能原因是什么。归根结底,它是执行多次迭代的相同代码。
java - 为什么我们必须固定每次测量迭代的持续时间?
迭代的时间是什么意思?
如果测量的时间是固定的,如果测量的迭代时间超过 2 秒,迭代将停止?如果这是真的,这对测量有什么影响。
java - 为什么返回 Java 对象引用比返回原语慢得多
我们正在开发一个对延迟敏感的应用程序,并且一直在对各种方法进行微基准测试(使用jmh)。在对查找方法进行微基准测试并对结果感到满意后,我实现了最终版本,却发现最终版本比我刚刚进行基准测试 的速度慢了 3 倍。
罪魁祸首是实现的方法返回一个enum
对象而不是int
. 这是基准代码的简化版本:
以上的基准测试结果:
只需更改函数的返回类型,性能就会提高近 3 倍。
我认为返回枚举对象与整数之间的唯一区别是一个返回一个 64 位值(引用),另一个返回一个 32 位值。我的一位同事猜测返回枚举会增加额外的开销,因为需要跟踪潜在 GC 的引用。(但鉴于枚举对象是静态最终引用,它需要这样做似乎很奇怪)。
性能差异的解释是什么?
更新
我在这里分享了 maven 项目,以便任何人都可以克隆它并运行基准测试。如果有人有时间/兴趣,看看其他人是否可以复制相同的结果会很有帮助。(我已经在 2 台不同的机器上进行了复制,Windows 64 和 Linux 64,两者都使用 Oracle Java 1.7 JVM 的风格)。@ZhekaKozlov 说他没有看到这些方法之间有任何区别。
运行:(克隆存储库后)
java - 如何为 JMH 使用 Java 8?
我使用 JMH 编写了一个基准测试,在构建时出现以下编译失败
JAVA_HOME
设置为 jdk1.8_40。我尝试pom.xml
在 jmh 源文件夹 jmh-core 中更改目标和源:
但我仍然得到同样的错误
java - 这个基准比较 Java 8u40 和 8u31 乘以 BigInteger 值是否正确?
我看到JDK-8055494 : Add C2 x86 intrinsic for BigInteger::multiplyToLen() 方法已针对 8u40 更新进行了修复,但我没想到它会将 BigInteger 乘法速度提高 2 到 3 倍。
以下是在两个 JVM 更新上通过不同公式计算阶乘的基准测试结果:
8u31
8u40
我应该期望这种 JDK 改进可以更快地运行我的代码,还是这又是一个临时基准?
编辑
如何验证我的发现以证明这种加速是由于 C2 固有的?
测试功能代码:
java - 如何生成 jmh 基准的动态调用图?
我想callgraph
从使用框架编写的基准生成jmh
。为此,我正在使用https://github.com/gousiosg/java-callgraph。我尝试为 jar 文件生成一个静态调用图target/benchmarks.jar
,它可以工作。现在我想生成动态调用图,所以我使用了以下命令:
但是没有callgraph.txt
创建输出文件。