Java 使用JMH时的奇怪输出
我正在使用jmh使用maven并遵循中建议的命令行方法对一个简单的应用程序(来自SO问题)进行基准测试。成功设置和构建基准后,我使用avgt模式获得以下基准结果:Java 使用JMH时的奇怪输出,java,maven,fork-join,jmh,Java,Maven,Fork Join,Jmh,我正在使用jmh使用maven并遵循中建议的命令行方法对一个简单的应用程序(来自SO问题)进行基准测试。成功设置和构建基准后,我使用avgt模式获得以下基准结果: C:\Users\username\my-app\test>java -jar target/benchmarks.jar -bm avgt -f 1 # JMH 1.10.1 (released 13 days ago) # VM invoker: C:\Program Files\Java\jre1.8.0_45\bin\j
C:\Users\username\my-app\test>java -jar target/benchmarks.jar -bm avgt -f 1
# JMH 1.10.1 (released 13 days ago)
# VM invoker: C:\Program Files\Java\jre1.8.0_45\bin\java.exe
# VM options: <none>
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: org.sample.MyBenchmark.testMethod
# Run progress: 0,00% complete, ETA 00:00:40
# Fork: 1 of 1
# Warmup Iteration 1: ? 10?? s/op
# Warmup Iteration 2: ? 10?? s/op
# Warmup Iteration 3: ? 10?? s/op
# Warmup Iteration 4: ? 10?? s/op
# Warmup Iteration 5: ? 10?? s/op
# Warmup Iteration 6: ? 10?? s/op
# Warmup Iteration 7: ? 10?? s/op
# Warmup Iteration 8: ? 10?? s/op
# Warmup Iteration 9: ? 10?? s/op
# Warmup Iteration 10: ? 10?? s/op
# Warmup Iteration 11: ? 10?? s/op
# Warmup Iteration 12: ? 10?? s/op
# Warmup Iteration 13: ? 10?? s/op
# Warmup Iteration 14: ? 10?? s/op
# Warmup Iteration 15: ? 10?¹? s/op
# Warmup Iteration 16: ? 10?? s/op
# Warmup Iteration 17: ? 10?¹? s/op
# Warmup Iteration 18: ? 10?? s/op
# Warmup Iteration 19: ? 10?¹? s/op
# Warmup Iteration 20: ? 10?¹? s/op
Iteration 1: ? 10?¹? s/op
Iteration 2: ? 10?¹? s/op
Iteration 3: ? 10?? s/op
Iteration 4: ? 10?¹? s/op
Iteration 5: ? 10?¹? s/op
Iteration 6: ? 10?? s/op
Iteration 7: ? 10?¹? s/op
Iteration 8: ? 10?? s/op
Iteration 9: ? 10?? s/op
Iteration 10: ? 10?¹? s/op
Iteration 11: ? 10?? s/op
Iteration 12: ? 10?? s/op
Iteration 13: ? 10?¹? s/op
Iteration 14: ? 10?? s/op
Iteration 15: ? 10?? s/op
Iteration 16: ? 10?¹? s/op
Iteration 17: ? 10?? s/op
Iteration 18: ? 10?¹? s/op
Iteration 19: ? 10?¹? s/op
Iteration 20: ? 10?¹? s/op
Result "testMethod":
? 10?¹? s/op
# Run complete. Total time: 00:00:40
Benchmark Mode Cnt Score Error Units
MyBenchmark.testMethod avgt 20 ? 10?¹? s/op
C:\Users\username\my app\test>java-jar target/benchmarks.jar-bm avgt-f 1
#JMH 1.10.1(13天前发布)
#VM调用程序:C:\Program Files\Java\jre1.8.0\U 45\bin\Java.exe
#虚拟机选项:
#预热:20次迭代,每次1s
#测量:20次迭代,每次1s
#超时:每次迭代10分钟
#线程:1个线程,将同步迭代
#基准模式:平均时间,时间/操作
#基准:org.sample.MyBenchmark.testMethod
#运行进度:0,00%完成,预计时间00:00:40
#叉子:1/1
#预热迭代1:?10?? s/op
#预热迭代2:?10?? s/op
#预热迭代3:?10?? s/op
#预热迭代4:?10?? s/op
#预热迭代5:?10?? s/op
#预热迭代6:?10?? s/op
#预热迭代7:?10?? s/op
#预热迭代8:?10?? s/op
#预热迭代9:?10?? s/op
#预热迭代10:?10?? s/op
#预热迭代11:?10?? s/op
#预热迭代12:?10?? s/op
#预热迭代13:?10?? s/op
#预热迭代14:?10?? s/op
#预热迭代15:?10?¹? s/op
#预热迭代16:?10?? s/op
#预热迭代17:?10?¹? s/op
#预热迭代18:?10?? s/op
#预热迭代19:?10?¹? s/op
#预热迭代20:?10?¹? s/op
迭代1:?10?¹? s/op
迭代2:?10?¹? s/op
迭代3:?10?? s/op
迭代4:?10?¹? s/op
迭代5:?10?¹? s/op
迭代6:?10?? s/op
迭代7:?10?¹? s/op
迭代8:?10?? s/op
迭代9:?10?? s/op
迭代10:?10?¹? s/op
迭代11:?10?? s/op
迭代12:?10?? s/op
迭代13:?10?¹? s/op
迭代14:?10?? s/op
迭代15:?10?? s/op
迭代16:?10?¹? s/op
迭代17:?10?? s/op
迭代18:?10?¹? s/op
迭代19:?10?¹? s/op
迭代20:?10?¹? s/op
结果“testMethod”:
? 10?¹? s/op
#运行完成。总时间:00:00:40
基准模式Cnt分数误差单位
MyBenchmark.testMethod avgt 20?10?¹? s/op
我不确定如何解释这个输出,但我很确定出了什么问题。。。?知道如何调试吗?JMH输出使用扩展的Unicode字符。特别是?10?? s/op“可能意味着”≈ 10⁻¹⁰ 使用正确支持Unicode的终端,请参阅
除了Unicode问题之外,您的基准似乎太短,因此JMH提供了一个数量级估计值,而不是显示“0.000 s/op”。要查看JMH输出中更精确的数字,您可以更改要使用的时间单位,例如
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class MyBenchmark {
...
如果您看到的是实际的问号而不是字符,则表示您的输出设备(终端)不支持JMH试图显示的字符的图示符。这可能是由于某些设置中的某些环境变量设置不正确,或者甚至是字体不完整。是否确定?将输出重定向到文本文件也会给我“问号”。使用-rff(写入文件)时选项中,我得到一个摘要,其中显示0000000,单位为s/o。输出中的?确实是由于我使用的终端不正确支持unicode造成的。查看步骤1后生成的MyBenchmark.java源文件,testMethod结果为空(因此很快终止)。我只是在其中插入了我的基准代码,它就工作了。但是,这不是使用jmh的正确/最佳方式,对吗?请查看jmh示例,了解如何使用它: