在老外的两篇博文中,https://plumbr.io/blog/performance-blog/more-about-spring-cache-performance
,https://plumbr.io/blog/performance-blog/spring-cache-profiling
分别讲解了,在@cache注解中,使用参数速度变慢(通过JMH)基准测试工具测试。
不使用参数:
@Cacheable("time")
public long annotationBased(String dummy) {return System.currentTimeMillis();
}
public long manual(String dummy) {Cache.ValueWrapper valueWrapper = cache.get(dummy);long result;if (valueWrapper == null) {result = System.currentTimeMillis();cache.put(dummy, result);} else {result = (long) valueWrapper.get();}return result;
}
JMH结果:
Benchmark Mode Cnt Score Error Units
CacheBenchmark.annotationBased avgt 5 245.960 ± 27.749 ns/op
CacheBenchmark.manual avgt 5 16.696 ± 0.496 ns/op
CacheBenchmark.nocache avgt 5 44.586 ± 9.091 ns/op
可以看到,avgt是平均执行每次操作的耗费时间长短,手工的快;
再看注解中有参数的:
@Cacheable(value = "time", key = "#p0.concat(#p1)")
public long annotationWithSpel(String dummy1, String dummy2) {return System.currentTimeMillis();
}
@Cacheable(value = "time")
public long annotationBased(String dummy1, String dummy2) {return System.currentTimeMillis();
}
JMH测试结果:
Benchmark Mode Cnt Score Error Units
CacheBenchmark.annotationBased avgt 5 271.975 ± 11.586 ns/op
CacheBenchmark.spel avgt 5 1196.744 ± 93.765 ns/op
CacheBenchmark.manual avgt 5 16.325 ± 0.856 ns/op
CacheBenchmark.nocache avgt 5 40.142 ± 4.012 ns/op