使用AspectJ的性能损失

时间:2016-08-14 11:07:04

标签: spring aop aspectj

我想创建一个注释,用于为我的方法发送计时器指标。我想过做那样的事情:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Timer {

}

然后我想使用AspectJ来执行度量收集逻辑,如下所示:

@Aspect
public class TimerAspect {

  @Pointcut("@annotation(Timer)")
  public void timerPointcut() {}

  @Pointcut("execution(* com.mycompany.**.*(..))")
  public void methodPointcut() {}


  @Before("methodPointcut() && timerPointcut()")
  public void startTimer() throws Throwable {
    // start timer logic here
  }

  @After("methodPointcut() && timerPointcut()")
  public void sendTimer() throws Throwable {
    // stop timer and send metrics logic here
  }
}

我想要了解的内容,以及我不确定如何对其进行基准测试,是否在使用此注释时我的性能会受到影响。

1 个答案:

答案 0 :(得分:2)

Spring AOP性能损失相当大,因为正在使用动态代理来通过每个呼叫进行路由。

AspectJ性能要好得多,罚款非常小,因为不需要动态代理。您可以在Spring中使用本机AspectJ,如Spring manual, chapter "Using AspectJ with Spring applications"

中所述

正如我的评论here中所述,您需要小心测量的内容。例如,与没有任何计时/日志记录的原始应用程序相比,测量实际计时和日志记录所需的额外时间是没有意义的,因为如果您通过分散的计时/日志记录语句手动添加这些时间,则也会存在惩罚。我也在推理分析方面here

如果你想衡量纯粹的方面惩罚,也许你可以这样做我的示例代码here