我们如何测量私有方法的执行时间?

4
我们使用拦截器来测量bean的公共方法调用的执行时间。然而,当bean的方法调用其他私有方法时,似乎忽略了审计拦截器。
我们如何测量私有方法的执行时间呢?
3个回答

5

使用AOP

您可以使用面向切面编程库(如AspectJ)来实现基准测试。

例如,参见:

使用分析器

  • 您可以实现自己的代理扩展(例如,对于JProfiler)。
  • 或者,您可以放弃拦截器,只需从任何分析器中检查允许捕获快照并记录执行时间即可。

使用JVMTI

实际上,这就是一些分析器所做的。

您可以使用JVMTI API(老实说我不确定这是否可行)来实现自己的代码检查器并直接连接到JVM。


关于内联问题

关于jb在他的答案中提出的(有效的)私有方法可能在编译时或运行时被内联的问题,一些JVM可能不会这样做,或允许禁用此功能。

  • Oracle的JRockit有一个-XnoOpt选项,可以禁用优化(包括这个特定的优化)。
  • Oracle/Sun的HotSpot至少曾经有-XX:-Inline(不确定它是否仍然存在或起作用)。

然而,这意味着您测量的并不完全是在激活内联时在生产中会出现的情况。不过,对于检查代码还是很方便的。


1

拦截器是由EJB容器在接口方法调用时应用的 - 您的私有方法对其不可见。那么使用分析工具呢?


1
我大多数情况下同意其他提议。 - Konstantin Pribluda

1

据我所知,私有方法可以在JVM空闲时(甚至在编译时)内联,因此它们无法被分析,因为它们可能不存在于字节码中。

我想你可以将你的方法标记为protected --- 这样即使在生产环境中也不会被内联,然后进行分析。

如果您想对测试实例进行分析,可以尝试使用VisualVM --- VisualVM是一个非常好的替代工具。VisualVM是一个图形化工具,用于分析JVM实例并执行所有必要的仪器操作。 http://visualvm.java.net/。此外,它是大多数jdk发行版中的标准工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接