代码之家  ›  专栏  ›  技术社区  ›  Antoine Claval

使用SpringAOP进行方法评测(基本执行时间)

  •  8
  • Antoine Claval  · 技术社区  · 16 年前

    我知道,是探查器101。 我使用TPTP分析器。但我对它不满意。坦率地说,我只是不明白它是如何工作的,当我评测我的应用程序(在评测模式下启动服务器)时,什么都不做要花很长时间。(好吧,不是我所期望的:执行时间的简单输出)

    所以我自己用系统时间进行评测(在方法的开头和结尾添加一行)。没那么糟。

    我的问题是:我想测量SpringAOP方法调用前后的系统时间,你能给我指示吗?这是个好主意/坏主意?代码库相当大,我们没有很多单元测试,这难道不是“危险”吗?

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

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

    4 回复  |  直到 12 年前
        1
  •  13
  •   Andrii Abramov Mk.Sl.    8 年前

    在春天有一个内置的支持。

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

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

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

        2
  •  1
  •   Nick Holt    16 年前

    AOP方法可以工作,但取决于您计划如何记录信息本身可能会影响性能——请注意,确保记录尽可能有效,并确保您的错误处理在您的方面是正确的。

    您可能还希望看起来像 Visual VM -这个工具给我留下了深刻的印象,它很容易使用,并且能够提供我上次使用它时所需要的信息。

        3
  •  1
  •   Csaba_H    16 年前

    除了Nick提到的VisualVM之外,另一个好的(免费开发的)软件是 Oracle JRockit Mission Control . 它的管理控制台 has the ability 对一些方法的简单概要调用(另外还有更多的概要选项,而且肯定比TPTP更快)。

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

    就我个人而言,我会首先使用VisualVM或JRockit任务控制。

        4
  •  1
  •   Community Mohan Dere    8 年前

    “profiler 101”的问题在于,它包含了许多想法,这些想法的合理性与其说是合理的思考,不如说是受欢迎的问题。

    最大的想法是,发现绩效问题的最佳方法是衡量绩效。

    这是自上而下的想法,就像通过查看每个部门的预算来寻找政府中的浪费。另一种方法是自下而上的方法,比如随机选取金钱或时间的几个单位,然后(最重要的)完全确定 为什么? 每一个都花掉了。

    This is the language-agnostic method I use.

    补充:你可能认为40%这样的大比例是不现实的,因为你无法想象, but it's entirely possible .