Странный вывод при использовании JMH

Я использую jmh для тестирования простого приложения (из вопроса SO Неожиданная масштабируемость приводит к 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

Я не уверен, как интерпретировать этот вывод, но я совершенно уверен, что что-то пошло не так ...? Есть идеи, что и как это отлаживать?


person Codiloo    schedule 08.07.2015    source источник
comment
Если вместо символов вы видите настоящие вопросительные знаки, это означает, что ваше устройство вывода (терминал) не поддерживает глифы для символов, которые JMH пытается отобразить. Это может быть из-за неправильной установки некоторых переменных среды в некоторых настройках или даже из-за неполного шрифта   -  person fge    schedule 08.07.2015
comment
Ты уверен насчет этого? Перенаправление вывода в текстовый файл также вызывает у меня «вопросительные знаки». При использовании параметра -rff (запись в файл) я получаю сводку, в которой указано 0,000000 с единицей измерения s / o.   -  person Codiloo    schedule 08.07.2015


Ответы (2)


В выводе JMH используются расширенные символы Unicode. Особенно, ? 10 ?? s / op "вероятно означает" ≈ 10⁻¹⁰ s / op ". Используйте терминал, который правильно поддерживает Unicode, см. this.

Помимо проблем с Unicode, ваш тест кажется слишком коротким, и поэтому JMH представляет оценку порядка величины вместо того, чтобы показывать «0,000 с / операцию».

person Aleksey Shipilev    schedule 08.07.2015
comment
? в выводе действительно были вызваны тем фактом, что терминал, который я использовал, не поддерживал должным образом Unicode. Глядя на исходный файл MyBenchmark.java, созданный после шага 1, testMethod оказался пустым (и, следовательно, завершился довольно быстро). Я просто вставил туда свой тестовый код, и он сработал. Однако это не лучший / правильный способ использовать jmh, верно? - person Codiloo; 09.07.2015
comment
Просмотрите образцы JMH, чтобы понять, как его использовать: hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/ - person Aleksey Shipilev; 09.07.2015

Чтобы увидеть более точные числа в выводе JMH, вы можете изменить используемую единицу времени, например

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class MyBenchmark {
    ...
person malloc4k    schedule 07.03.2020