咖啡因与番石榴缓存比较

38
根据这些 微基准测试 ,发现在读和写操作方面,CaffeineGuava Cache 更快。
Caffeine 实现的秘密是什么?它与 Guava Cache 有何不同?
在定时过期的情况下,Caffeine是否使用定时执行程序在后台执行适当的维护操作?
1个回答

87
主要差异在于Caffeine使用环形缓冲区来记录和重放事件,而Guava使用ConcurrentLinkedQueue。原意始终是将Guava迁移过来,并且从简单开始很有道理,但不幸的是,从未有兴趣接受这些更改。环形缓冲器方法避免了分配,是有界(有损失),并且对操作更加经济。
其余费用是由于设计不匹配。MapMaker的原始作者热衷于软引用作为通过将其推迟到GC来解决缓存问题的解决方案。不幸的是,尽管在微基准测试中似乎很快,但由于导致停机GC抖动,在实践中表现非常糟糕。基于大小的解决方案必须适应这项工作,这并不理想。Caffeine优化了基于大小的解决方案,并获得了改进的哈希表,而Guava更优雅地处理引用缓存。
Caffeine不会为维护或过期创建自己的线程。它将成本推迟到commonPool中,这略微提高了用户面向的延迟,但并没有提高吞吐量。未来版本可能会利用CompletableFuture.delayedExecutor安排下一个到期事件,而无需直接创建线程(对于有业务逻辑依赖于及时移除通知的用户)。

ConcurrentLinkedHashMapMapMaker是同时编写的,CLHM的性能与Caffeine相似。 我认为差异在于设计师偏爱和优化的场景,这影响了其他功能的实现方式。 有一些简单的方法可以让Guava具备类似的性能特征,但没有内部冠军来推动这一点(尤其是Caffeine作为首选替代品的情况下更是如此)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接