2015-07-08 5 views
0

Я использую jmh для сравнения простого приложения (из вопроса SO Unexpected Scalability results in java fork-join), используя maven и следуя подходу командной строки, как описано в http://openjdk.java.net/projects/code-tools/jmh/. После успешного создания и построения теста, я получаю следующие результаты тестирования с использованием avgt режима:Странный выход при использовании JMH

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 

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

+1

Если вы видите фактические вопросительные знаки вместо символов, это означает, что ваше устройство вывода (терминал) не поддерживает глифы для символов, которые JMH пытается отобразить. из-за того, что некоторые переменные среды неправильно установлены в некоторых настройках или даже неполный шрифт – fge

+0

Уверены ли вы в этом? Перенаправление вывода в текстовый файл также дает мне «вопросительные знаки». При использовании опции -rff (write to file) , Я получаю сводку, где указано 0,000000 с единицей в/о. – Codiloo

ответ

2

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

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

+0

? в результате действительно были вызваны тем, что используемый терминал I не поддерживал юникод должным образом. Посмотрев исходный файл MyBenchmark.java, сгенерированный после шага 1, testMethod оказался пустым (и, следовательно, довольно быстро завершился). Я просто вставил свой контрольный код там, и он сработал. Однако, это не правильный/лучший способ использования jmh, так? – Codiloo

+1

Просмотрите образцы JMH, чтобы получить представление о том, как его использовать: http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/ JMH/образцы / –

Смежные вопросы