当前位置: 首页 > 知识库问答 >
问题:

如何抑制打印到jmh基准内控制台的方法的输出?

骆照
2023-03-14

我使用jmh来比较在控制台上大量打印的几种方法的性能。事实上,这些都是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);
}

然后一切正常。但这是一堆重复的代码,我不想摆脱它。此外,此代码会中断测量,因为每次运行测试时都会调用它。

我正在尝试使用状态来完成任务。

@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() {
    new NaiveFizzBuzz().print(N);
}

// Lots of similar benchmarks here...

但它不起作用。

如何将替换输出流的所有代码放在一个地方,以便在每次测试运行之前自动执行?

共有1个答案

徐君植
2023-03-14

我找到了问题的解决方案。它包括这样一个事实,即我需要将我的状态对象作为参数传递给每个基准。

@Benchmark
public void naiveTest(MyState state) {
    new NaiveFizzBuzz().print(N);
}

完全按照我的需要工作。

不幸的是,jmh的留档不是很人性化,所以我花了一段时间才找到这一点。

我做了一些研究,得出结论,可以回答我自己的问题。如果不是这样,请纠正我。然后我会编辑这个问题。

 类似资料:
  • 问题语句:我有一个在Xcode中运行的程序,它有一堆print()语句,可以很好地将输出打印到调试控制台。然而,我希望也能够将这些输出重定向到一个文件,这样我就可以让用户将它们发送给我,作为调试的一种方式。 SO上找到的解决方案使我可以将输出重定向到文件,但调试控制台输出将丢失。 问:我想要我的蛋糕和吃它。我希望能够将print()语句重定向到调试控制台和文件。 所以我有引用:https://st

  • 我目前有一个JMH基准测试来衡量所有实现相同接口的各种数据结构的性能。基准测试工作正常,但我想为每个基准测试打印一些额外的信息,这些信息描述了我的数据结构在试验前后的状态。 目前,我正在做下面的代码 问题是与JMH的输出混淆。有没有办法避免这种情况,并在JMH完成其试验报告后运行我的打印声明?另一种方法是将其写入一个文件,然后进行合并,但最好得到一个不需要手动合并的报告。

  • 问题内容: 在Java应用程序中,我使用了对的调用。现在,我想找到一种以编程方式删除此内容的方法。 我找不到与谷歌的任何解决方案,所以有什么提示吗? 问题答案: 你可以将退格字符打印的次数与之前打印的字符相同。 注意:这在Mars(4.5)之前的旧版本的Eclipse控制台中无法正常工作。但是,这在命令控制台中可以正常工作。

  • 我试图使用TDD(测试驱动开发)与。当我使用时,不会到控制台。 我正在使用来运行它。 似乎说默认情况下它应该工作:http://pytest.org/latest/capture.html 但是: 没有任何东西被打印到我的标准输出控制台(只是正常的进度和多少测试通过/失败)。 我正在测试的脚本包含打印: 在模块中,默认情况下打印所有内容,这正是我所需要的。但是,出于其他原因,我希望使用。 有人知道

  • 问题内容: 如何在Mac OS X和Linux上使用“ printf”输出彩色文本? 问题答案: 您可以使用ANSI颜色代码。这是一个示例程序: 该是字符。如果愿意,可以使用。 网上有所有代码的清单。 这是一个。

  • 问题内容: 我想在用户调用/ button之后,简单地在Python控制台上打印一个“ hello world”。 这是我的幼稚方法: 背景:我想从flask(而不是shell)执行其他python命令。“打印”应该是最简单的情况。我相信我对这里的基本理解还不了解。提前致谢! 问题答案: 看来你已经解决了问题,但是对于其他寻求此答案的人来说,一种简单的方法是通过打印到stderr。你可以这样做: