使用Spring AOP进行方法分析(基本执行时间)

我正在寻找一个function或软件,他将允许我轻松地分析我的方法执行时间,并选择通过包filter分析的内容。

我知道,它是分析器101.我使用TPTP分析器。 但我对它并不满意。 坦率地说,我只是不明白它是如何工作的,当我描述我的应用程序(以剖析模式启动服务器)时,它将永远无所事事。 (好吧,不是我的期望:执行时间的简单输出)

所以我用系统时间自己进行分析(在方法的开头和结尾添加一行)。 也不是那么坏。

我的问题是:我想测量使用Spring AOP进行方法调用之前和之后的系统时间,你能给我指点吗? 这是一个好/坏的主意? 代码库非常大,我们没有很多unit testing,难道不是“危险”吗?

我不是要求代码,我想我可以用这种链接自己做: http : //static.springsource.org/spring/docs/2.5.x/reference/aop.html

但如果你有一个很好的教程(以前从未做过AOP,只知道这个概念),我就接受了。

在Spring中有一个内置的支持。

我试图寻找教程,但令人惊讶的是我没有找到它,所以我将尝试在这里解释它。 (编辑:我在这里将这个例子添加到我的博客中)

基本上你需要的是像这样扩展CustomizableTraceInterceptor类:

public class MyTraceInterceptor extends CustomizableTraceInterceptor { protected void writeToLog(Log logger, String message, Throwable ex) { if (ex != null) { logger.info(message, ex); } else { logger.info(message); } } protected boolean isInterceptorEnabled(MethodInvocation invocation, Log logger) { return true; } } 

此类包装您的bean并输出方法调用信息,包括参数,返回值和执行时间到日志。 通过更改writeToLog()方法,您可以控制要输出数据的位置以及严重程度。

现在您需要一些XML来实际选择要包装的bean:

            traceInterceptor     

基本上你用“beanNames”中的通配符定义要包装的bean,“order”控制包装的顺序 – 如果你没有其他的AOP类,你可以删除它。 如果更改enterMessage和exitMessage属性,也可以更改输出格式。

这应该足以让你开始。 如果您需要澄清,请不要犹豫。

AOP方法可行,但取决于您计划记录信息的方式本身会影响性能 – 只需要注意这一点,确保记录尽可能高效,并确保您的error handling它在您的方面。

您可能还希望看起来像Visual VM – 我对此工具印象深刻,它易于使用,并且能够为我提供上次使用时所需的信息。

除了VisualVM之外,Nick提到了另一个好的(并且可以免费开发)软件是Oracle JRockit Mission Control 。 它的管理控制台能够简单地调用某些方法的调用(此外还有更多的分析选项,并且肯定比TPTP更快)。

与在方法调用之前/之后的测量系统时间一样:基本上它可以工作但是有一些小的“缺陷”(例如后台应用程序可以“改变”结果)。

我个人会首先使用VisualVM或JRockit Mission Control。

“剖析器101”的问题在于它体现了许多想法,其理由更多的是受欢迎而不是合理的思考。

最大的想法是找到性能问题的最佳方法是测量性能。

这是自上而下的想法,就像通过查看每个部门的预算来试图在政府中找到浪费。 另一种选择是自下而上的方法,例如选择金钱或时间的几个随机单位,并且(最重要的)确定为什么每个单位都被花费。

如果有浪费,这很快就会找到它。 原因很简单,如果浪费了一些百分比(比如说40%),那么样本的百分比(平均)就会精确地显示它是如何被浪费的。

这是我使用的与语言无关的方法。

补充:您可能认为像40%这样的很大一部分是不现实的,因为您无法想象它, 但它完全有可能 。