我想为我的方法创建一个发送计时器指标的注释。我想做这样的事情:
@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
}
}
我想了解的是,我不知道如何对其进行基准测试,在这里使用此注释时是否会有性能损失。
Spring AOP性能损失相当大,因为正在使用动态代理来路由每个调用。
AspectJ的性能要好得多,代价非常小,因为不需要动态代理。您可以在Spring中使用本机AspectJ,如Spring手册“将AspectJ与Spring应用程序一起使用”一章中所述。
正如我在这里的评论中所描述的,您需要小心测量。例如,与没有任何计时/日志记录的原始应用程序相比,测量执行实际计时和日志记录所需的额外时间是没有意义的,因为如果您通过分散的计时/日志记录语句手动添加这些时间,那么也会存在惩罚。我在这里还讨论了分析方面。
如果您想测量纯方面损失,也许您可以像我这里的示例代码一样进行。
我试图在Spring framework 4.1.6和 AOP方法有clean、jdk动态代理和aspectJ。 我给他们提了一到五个简单的建议,并检查了每个建议的运行时间。 结果: jdk动态代理: null aspect1:2.499秒。 aspect2:2.574 方面3:2.466 方面4:2.436 方面5:2.563 aspectJ(ctw): null 方面1:2.648 方面2:2
问题内容: 目前,我对新的react hooks API 的用例以及您可能会做的事情感到非常惊讶。 实验时出现的一个问题是,总是创建一个新的处理函数仅在使用时就扔掉是多么昂贵。 考虑以下示例: 尽管我将处理程序包装为,以避免每次渲染新处理程序时都会传递新的处理程序,但仍然必须创建内联箭头函数,而在大多数情况下都必须将其丢弃。 如果我只渲染几个组件,可能没什么大不了的。但是,如果我这样做数千次,对性
问题内容: 有效的Java说: 使用终结器会严重影响性能。 为什么使用终结器销毁对象会更慢? 问题答案: 由于垃圾收集器的工作方式。为了提高性能,大多数Java GC使用复制收集器,将短期对象分配到“ eden”内存块中,当需要收集该代对象时,GC只需要复制那些仍然“活跃”到更永久的存储空间,然后它可以立即擦除(释放)整个“ eden”存储块。这是有效的,因为大多数Java代码会创建生命周期只有几
这是.NET framework 4.8---->.NET core 5.0 我有一个个人的国际象棋引擎,我正在工作,昨天我决定从.NET framework切换到.NET Core。 在这个过程中我没有更改1行代码,完全相同的代码。 当我这样做的时候,我注意到损失了几个百分点,在2%到5%之间(目前为止) 这足以看出perft每秒平均有500,000到200,000步的差异(如果你不知道这是什么
希, 读了很多关于Spring AOP vs AspectJ的文章,我还是有些疑惑: 谢谢
问题内容: 我们已经开始将spring aop用于我们应用程序的各个方面(当前的安全性和缓存)。 我的经理虽然十分了解这种技术的好处,但仍担心该技术对性能的影响。 我的问题是,你是否遇到了使用aop(特别是spring aop)引入的性能问题? 问题答案: 只要你能够控制自己的AOP,我就认为它是有效的。无论如何,我们确实确实存在性能问题,所以通过我们自己的推理,我们无法完全控制;)这主要是因为重