我正在寻找一个功能或软件,允许我轻松地分析我的方法执行时间,并选择通过包过滤器分析的内容。
我知道,这是剖析器101。 我使用TPTP分析器。但我对它并不满意。坦率地说,我只是不明白它是如何工作的,当我描述我的应用程序(以分析模式启动服务器)时,它将永远不做任何事情。 (好吧,不是我的期望:执行时间的简单输出)
所以我自己用系统时间进行分析(在方法的开头和结尾添加一行)。也不是那么坏。
我的问题是:我想测量使用Spring AOP进行方法调用之前和之后的系统时间,你能给我指点吗?这是一个好/坏的主意?代码库非常大,我们没有很多单元测试,难道不是“危险”吗?
我不是要求代码,我想我可以用这种链接自己做: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html
但如果你有一个很好的教程(以前从未完成过AOP,只知道这个概念),我就接受了。
答案 0 :(得分:13)
在Spring中有内置的支持。
我试图寻找教程,但令人惊讶的是我还没找到,所以我会尝试在这里解释一下。 (编辑:我将此示例添加到我的博客here)
基本上你需要的是像这样扩展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:
<!-- Tracing -->
<bean name="traceInterceptor" class="MyTraceInterceptor" dependency-check="none">
<property name="enterMessage" value="ENTER: $[targetClassShortName].$[methodName]($[arguments])"/>
<property name="exitMessage"
value="EXIT: $[targetClassShortName].$[methodName]() : $[invocationTime]ms : $[returnValue]"/>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" dependency-check="none">
<property name="beanNames" value="*RequestListener,*Notifier"/>
<property name="proxyTargetClass" value="true"/>
<property name="interceptorNames">
<list>
<value>traceInterceptor</value>
</list>
</property>
<property name="order" value="2"/>
</bean>
基本上,您在“beanNames”中定义要使用通配符包装的bean,并且“order”控制包装的顺序 - 如果您没有其他AOP类,则可以将其删除。如果更改enterMessage和exitMessage属性,也可以更改输出格式。
这应该足以让你入门。如果您需要澄清,请不要犹豫。
答案 1 :(得分:1)
AOP方法可行,但取决于您计划如何记录信息本身会影响性能 - 请注意这一点,确保日志记录尽可能高效,并确保您的错误处理它在点上你的方面。
您可能还希望看作Visual VM - 我对此工具印象深刻,它易于使用,并且能够为我提供上次使用时所需的信息。
答案 2 :(得分:1)
除了VisualVM之外,Nick还提到了另一个好的(并且可以免费开发)软件Oracle JRockit Mission Control。它的管理控制台has the ability用于简单调用某些方法的调用(加上有更多的分析选项,并且肯定比TPTP更快)。
与方法调用之前/之后的测量系统时间一样:基本上它可以工作,但有一些小的“缺陷”(例如后台应用程序可以“改变”结果)。
我个人会首先使用VisualVM或JRockit Mission Control。
答案 3 :(得分:1)
“剖析器101”的问题在于它体现了许多想法,其理由更多的是受欢迎而不是合理的思考。
最大的想法是找到性能问题的最佳方法是测量性能。
这是自上而下的想法,就像通过查看每个部门的预算来试图在政府中找到浪费。另一种选择是自下而上的方法,例如选择金钱或时间的几个随机单位,并且(最重要的)确定完全为什么每个单位花费。
如果有浪费,很快就会找到它。原因很简单,如果浪费了一些百分比(比如40%),那么样本的百分比(平均而言)就会精确地显示它是如何被浪费的。
This is the language-agnostic method I use.
补充:您可能认为像40%这样的大部分是不现实的,因为您无法想象它,but it's entirely possible。