Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在jmh基准测试中抑制打印到控制台的方法的输出?_Java_Microbenchmark_Jmh - Fatal编程技术网

Java 如何在jmh基准测试中抑制打印到控制台的方法的输出?

Java 如何在jmh基准测试中抑制打印到控制台的方法的输出?,java,microbenchmark,jmh,Java,Microbenchmark,Jmh,我用它来比较在控制台上大量打印的几种方法的性能。事实上,这些是fizzbazz问题的不同解决方案 fizzbuzz的每个实现都是一个类,它实现FizzBazz接口并具有print()方法。所有这些实现都被编译到一个单独的jar中 我试图在我的基准测试中抑制这种方法的输出。因此,我需要在运行基准测试之前用数组替换输出流,并在测试完成后返回 如果我在每个基准方法中都这样做,如下所示: @Benchmark public void naiveTest() { PrintStream origi

我用它来比较在控制台上大量打印的几种方法的性能。事实上,这些是fizzbazz问题的不同解决方案

fizzbuzz的每个实现都是一个类,它实现FizzBazz接口并具有print()方法。所有这些实现都被编译到一个单独的jar中

我试图在我的基准测试中抑制这种方法的输出。因此,我需要在运行基准测试之前用数组替换输出流,并在测试完成后返回

如果我在每个基准方法中都这样做,如下所示:

@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的“文档”确实在它的示例中。你的确切情况是