如何解决从 JMH 中的分析中排除 @Setup 方法
我正在使用 JMH 在 JVM 上对一些代码进行基准测试,并且我编写了一个注释为 @Setup
方法的方法,该方法需要很长时间才能运行。当然,正如预期的那样,这种方法没有包含在基准测试中 - 但不幸的是,当我尝试使用 JMH 的内置分析支持时,它 被包含在内,这会用各种不相关的内容污染配置文件报告在实际基准测试方法本身期间未调用的方法调用。这种行为似乎没有记录在任何地方,但在 JMH 源代码中,有以下注释:
// profilers start way before the workload starts to capture
// the edge behaviors.
似乎没有任何选项可以在 JMH 中禁用此行为。如何将 @Setup
方法以及源自它们的任何堆栈跟踪排除在探查器结果中? (@Setup
方法不会直接或间接从 @Benchmark
方法调用。)
解决方法
这样做的一个相对明显的方法是避免使用 JMH,而仅使用分析器本身。但是,这需要一些设置。在 Java 中,您可以添加 public static void main
方法,或者在 Scala 2.12 中,您可以添加扩展 object
的配套 App
,以创建实用程序应用程序,其中应包含以下代码:
Benchmark b = new Benchmark(); // assuming your benchmark is defined in a class called Benchmark
b.setupMethod();
System.out.println("Attach a profiler and then press Enter to continue");
new Scanner(System.in).nextLine();
b.benchmarkedMethod();
如果您正在使用采样分析器并且您的 benchmarkedMethod
速度非常快,请将其放入具有多次迭代的 for
循环中,以便程序运行足够长的时间以使采样分析器能够收集足够的样本来提供有用的报告。但是,如果您使用的是试图记录所有方法调用的传统分析器,并且您的基准测试方法在功能上是确定性的(它每次都做同样的事情,以不同的内存地址和类似的低级事物为模),请不要这样做那是因为完全不需要分析。
然后运行实用程序,根据指示附加分析器,然后按 Enter。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。