【问题标题】:Strange output when using JMH使用 JMH 时的奇怪输出
【发布时间】:2015-07-08 12:01:34
【问题描述】:

我正在使用 jmh 对一个简单的应用程序(来自 SO 问题 Unexpected Scalability results in java fork-join)进行基准测试,该应用程序使用 maven 并按照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

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

【问题讨论】:

  • 如果您看到实际的问号而不是字符,这意味着您的输出设备(终端)不支持 JMH 尝试显示的字符的字形。这可能是由于某些设置中的某些环境变量设置不正确,甚至是字体不完整
  • 你确定吗?将输出重定向到文本文件也会给我“问号”。使用 -rff(写入文件)选项时,我得到一个摘要,其中显示 0,000000,单位为 s/o。

标签: java maven fork-join jmh


【解决方案1】:

JMH 输出使用扩展的 Unicode 字符。尤其, ? 10?? s/op" 大概意思是 "≈ 10⁻¹⁰ s/op"。使用正确支持 Unicode 的终端,见this

除了 Unicode 问题之外,您的基准似乎太短了,因此 JMH 提供了一个数量级的估计值,而不是显示“0.000 s/op”。

【讨论】:

  • 那个?在输出中确实是由于我使用的终端不正确支持 unicode 造成的。查看步骤 1 之后生成的 MyBenchmark.java 源文件,结果 testMethod 为空(因此很快终止)。我只是在其中插入了我的基准代码,它就可以工作了。但是,这不是使用 jmh 的正确/最佳方式,对吧?
  • 查看 JMH 示例以了解如何使用它:hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/…
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多