Java 如何在jmh基准测试中抑制打印到控制台的方法的输出?
我用它来比较在控制台上大量打印的几种方法的性能。事实上,这些是fizzbazz问题的不同解决方案 fizzbuzz的每个实现都是一个类,它实现FizzBazz接口并具有print()方法。所有这些实现都被编译到一个单独的jar中 我试图在我的基准测试中抑制这种方法的输出。因此,我需要在运行基准测试之前用数组替换输出流,并在测试完成后返回 如果我在每个基准方法中都这样做,如下所示:Java 如何在jmh基准测试中抑制打印到控制台的方法的输出?,java,microbenchmark,jmh,Java,Microbenchmark,Jmh,我用它来比较在控制台上大量打印的几种方法的性能。事实上,这些是fizzbazz问题的不同解决方案 fizzbuzz的每个实现都是一个类,它实现FizzBazz接口并具有print()方法。所有这些实现都被编译到一个单独的jar中 我试图在我的基准测试中抑制这种方法的输出。因此,我需要在运行基准测试之前用数组替换输出流,并在测试完成后返回 如果我在每个基准方法中都这样做,如下所示: @Benchmark public void naiveTest() { PrintStream origi
@Benchmark
public void naiveTest() {
PrintStream originalOut = System.out;
ByteArrayOutputStream outContent = new ByteArrayOutputStream();
System.setOut(new PrintStream(outContent));
new NaiveFizzBuzz().print(N); // N is upper limit
System.setOut(originalOut);
}
@Benchmark
public void naiveTest() {
new NaiveFizzBuzz().print(N);
}
// Lots of similar benchmarks here...
然后一切正常。但这是一堆重复的代码,我不想摆脱它。此外,此代码会中断测量,因为每次运行测试时都会调用它
我正在尝试将状态用于我的任务
@State(Scope.Benchmark)
public static class MyState {
private PrintStream originalOut;
@Setup
public void doSetup() {
originalOut = System.out;
ByteArrayOutputStream outContent = new ByteArrayOutputStream();
System.setOut(new PrintStream(outContent));
}
@TearDown
public void doTearDown() {
System.setOut(originalOut);
}
}
我的基准如下所示:
@Benchmark
public void naiveTest() {
PrintStream originalOut = System.out;
ByteArrayOutputStream outContent = new ByteArrayOutputStream();
System.setOut(new PrintStream(outContent));
new NaiveFizzBuzz().print(N); // N is upper limit
System.setOut(originalOut);
}
@Benchmark
public void naiveTest() {
new NaiveFizzBuzz().print(N);
}
// Lots of similar benchmarks here...
但它不起作用
如何将用于替换输出流的所有代码放在一个位置,以便在每次测试运行之前自动执行它?我找到了解决问题的方法。它包括这样一个事实:我需要将我的state对象作为参数传递给每个基准
@Benchmark
public void naiveTest(MyState state) {
new NaiveFizzBuzz().print(N);
}
完全符合我的需要
不幸的是,jmh的文档对用户不是很友好,所以我花了一段时间才找到这一点
我做了一些研究,得出结论,回答我自己的问题是可以的。如果不是这样,请纠正我。然后我将编辑问题。1)回答您自己的问题完全可以2)JMH的“文档”确实在它的示例中。你的确切情况是