Печать дополнительных выходных данных из тестов jmh

#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 содержит информацию из итерации. Вы можете смешать это со своим пользовательским выводом и распечатать какой-нибудь хороший отчет.