#java #printing #benchmarking #jmh
#java #печать #сравнительный анализ #jmh
Вопрос:
В настоящее время у меня есть тест JMH для измерения производительности различных структур данных, которые реализуют один и тот же интерфейс. Тест работает нормально, но я хотел бы распечатать некоторую дополнительную информацию для каждого теста, которая описывает состояние моей структуры данных до и после испытаний.
В настоящее время я делаю что-то вроде приведенного ниже кода
@Param({"impl0", "impl1", "impl2"})
String dataStructureImplementation;
DataStructureInterface dataStructure;
List<String> inputData;
@Setup(Level.Trial)
public void setUp() {
switch (dataStructureImplementation) {
case "impl0":
dataStructure = new DataStructureImplementation0();
break;
case "impl1":
dataStructure = new DataStructureImplementation1();
break;
case "impl2":
dataStructure = new DataStructureImplementation2();
break;
default:
throw new IllegalArgumentException();
}
setUpDataStructure();
inputData = readInputDataFromFile();
System.out.println(dataStructure.getStateRepresentation());
}
@TearDown(Level.Trial)
public void tearDown() {
System.out.println(dataStructure.getStateRepresentation());
}
@Benchmark
@OperationsPerInvocation(1000000)
public void queryDataStructure(Blackhole bh) {
for (String datum : inputData)
bh.consume(dataStructure.query(datum));
}
Проблема в том, что вывод из System.out.println
искажается выводом из JMH. Есть ли способ избежать этого и запустить мой оператор печати после того, как JMH завершит свой отчет для пробной версии? Альтернативой является запись этого в файл и последующая консолидация, но было бы неплохо получить единый отчет, который мне не нужно консолидировать вручную.
Ответ №1:
Не существует готового способа накапливать некоторые выходные данные в пользовательском формате из методов @Setup и @Teardown и добавлять их в окончательный отчет.
Один из способов, которым вы могли бы подойти к этому, — добавить желаемый результат в файл и распечатать его содержимое после завершения всех ваших тестов.
Однако для запуска тестов вам необходимо использовать класс Runner.
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class BenchmarkTestWithMoreOutput {
public static void main(String[] args) throws RunnerException {
// This is just a very basic setup just to get an idea
Options opt = new OptionsBuilder()
.include(BenchmarkTestWithMoreOutput.class.getSimpleName())
.forks(2)
.build();
Collection<RunResult> results = new Runner(opt).run();
// Now print your file content.
// It will be printed after the default JMH report
}
@Benchmark
public int benchmarkMethod() {
// code to benchmark
}
}
Объект RunResult содержит информацию из итерации. Вы можете смешать это со своим пользовательским выводом и распечатать какой-нибудь хороший отчет.