微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 JMH 中的分析中排除 @Setup 方法

如何解决从 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?