1

我正在阅读有关缓存机制的内容,并使用带有 AspectJ 的 SpringCaching 创建了一个 EhCache 示例项目,并使用带有 AspectJ 的 SpringCaching 将其与谷歌缓存进行了基准测试。我的发现,让我有点吃惊。

注意:- 我的意思是 Spring Caching,方法使用 @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

4

1 回答 1

1

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

文章中的数据清楚地表明,与 Spring AOP 相比,AspectJ 在运行时开销方面要优越得多(在视觉水平上甚至比手动缓存更好)。这是因为:

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