8

我正在寻找一种功能或软件,它可以让我轻松地分析我的方法执行时间并通过包过滤器选择要分析的内容。

我知道,它是分析器 101。我使用 TPTP 分析器。但我对此并不满意。坦率地说,我只是不明白它是如何工作的,当我分析我的应用程序(以分析模式启动服务器)时,永远什么都不做。(嗯,不是我所期望的:执行时间的简单输出)

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

我的问题是:我想用 Spring AOP 测量方法调用前后的系统时间,你能给我指导吗?这是个好主意/坏主意?代码库很大,而且我们没有太多的单元测试,会不会很“危险”?

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

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

4

4 回答 4

13

在 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:

    <!-- 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 属性,还可以更改输出格式。

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

于 2009-09-02T08:23:04.700 回答
1

AOP 方法会起作用,但取决于您计划如何记录信息本身可能会影响性能 - 请注意这一点,确保记录尽可能高效,并确保您的错误在您的方面处理它。

您可能还希望将其视为Visual VM - 这个工具给我留下了深刻的印象,它易于使用,并且能够为我提供上次使用它时所需的信息。

于 2009-09-02T08:16:00.377 回答
1

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

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

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

于 2009-09-02T09:01:35.590 回答
1

“profiler 101”的问题在于它体现了许多想法,其理由更多的是受欢迎程度而不是合理的想法。

最大的想法是发现性能问题的最佳方法是测量性能。

那是自上而下的思维,就像是通过查看每个部门的预算来寻找政府的浪费。另一种方法是自下而上的方法,例如选择几个随机的金钱或时间单位,并且(最重要的)完全确定每个单位被花费的原因。

如果有废物,这将很快找到它。原因很简单,如果某个百分比(例如 40%)被浪费了,那么该百分比的样本(平均而言)将准确地告诉您它是如何被浪费的。

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

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

于 2009-09-02T17:17:24.183 回答