使用JMH时输出奇怪

时间:2015-07-08 12:01:35

标签: java maven fork-join jmh

我正在使用jmh使用maven对一个简单的应用程序(来自SO问题Unexpected Scalability results in java fork-join)进行基准测试,并遵循http://openjdk.java.net/projects/code-tools/jmh/中建议的命令行方法。在成功设置和构建基准测试后,我使用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\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

我不知道如何解释这个输出,但我确定出了问题......?知道调试什么或如何调试吗?

2 个答案:

答案 0 :(得分:5)

JMH输出使用扩展的Unicode字符。特别是, ? 10? s / op“可能意味着”≈10 - 15 s / op“。使用支持Unicode的终端,请参阅this

除了Unicode问题之外,你的基准测试似乎太短了,所以JMH提出了一个数量级的估计,而不是显示“0.000 s / op”。

答案 1 :(得分:0)

要在JMH输出中查看更精确的数字,您可以更改要使用的时间单位,例如

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class MyBenchmark {
    ...