在老外的两篇博文中,​​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