我想创建一个注释,用于为我的方法发送计时器指标。我想过做那样的事情:
@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
}
}
我想要了解的内容,以及我不确定如何对其进行基准测试,是否在使用此注释时我的性能会受到影响。
答案 0 :(得分:2)
Spring AOP性能损失相当大,因为正在使用动态代理来通过每个呼叫进行路由。
AspectJ性能要好得多,罚款非常小,因为不需要动态代理。您可以在Spring中使用本机AspectJ,如Spring manual, chapter "Using AspectJ with Spring applications"。
中所述正如我的评论here中所述,您需要小心测量的内容。例如,与没有任何计时/日志记录的原始应用程序相比,测量实际计时和日志记录所需的额外时间是没有意义的,因为如果您通过分散的计时/日志记录语句手动添加这些时间,则也会存在惩罚。我也在推理分析方面here。
如果你想衡量纯粹的方面惩罚,也许你可以这样做我的示例代码here。