打印jmh基准测试的附加输出

xggvc2p6  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(361)

我目前有一个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的输出混淆。有没有办法避免这种情况,让我的print语句在jmh完成试验报告后运行?另一种方法是将其写入一个文件,然后进行合并,但最好得到一个不需要手动合并的报表。

eagi6jfj

eagi6jfj1#

没有现成的方法可以从@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对象包含来自迭代的信息。你可以把它和你的自定义输出混合起来,打印一些漂亮的报告。

相关问题