为什么使用AspectJ的google缓存很慢而SpringCaching更快

时间:2015-04-13 17:07:13

标签: java caching guava aspectj spring-cache

我正在阅读有关缓存机制的文章,并使用带有AspectJ的SpringCaching创建了一个EhCache示例项目,并使用SpringJaching和AspectJ对谷歌缓存进行基准测试。我发现的,对我来说有点意外。

注意: - Spring缓存我的意思是,方法使用@ Cacheable / @Caching注释进行注释。

使用AspectJ的SpringCaching更适合,但另一方面,使用AspectJ的google缓存执行速度较慢。以下是处理请求所用时间的平均值: -

GoogleCacheWithoutAspect 
1.262323232 ms

GoogleCacheWithAspect
5.205010101 ms

SpringCachingWithoutAspect
3.08548 ms

SpringCachingWithAspect
2.77782 ms

由于我是新手,所以我也想确认,为什么要使用AspectJ和Spring Caching,AspectJ如何更快地进行缓存。

我也遵循以下帖子,但仍然不确定,AspectJ是否真的提高了缓存性能。 http://architects.dzone.com/articles/cacheable-overhead-spring-0

1 个答案:

答案 0 :(得分:1)

  

仍然不确定,AspectJ是否真的提高了缓存性能

来自article的数据清楚地表明,与Spring AOP相比,AspectJ在运行时开销方面远优于(与眼睛级别相比甚至优于手动缓存)。这是因为:

  • Spring使用动态代理(即在运行时动态创建的子类或接口实现),并且由于每个调用都通过代理路由以实现AOP拦截行为,因此总是引入调用链。这适用于Java动态代理(用于接口)以及CGLIB代理(用于类)。
  • AspectJ不需要任何代理,因为它通过字节码检测将优化的代码直接编织到原始类中。这在编译期间完成,或者在类加载期间每JVM启动一次。这是快速有效的。