根据这些微基准测试,事实证明Caffeine在读取和写入操作中都比Guava缓存快得多。
咖啡因实现的秘密是什么?它与番石榴缓存有何不同?
在定时过期的情况下,咖啡因使用预定的执行程序在后台执行适当的维护操作,我说得对吗?
主要区别是因为咖啡因使用环形缓冲液来记录
剩余的成本是由于设计不匹配。MapMaker
的原始作者热衷于将软引用作为缓存问题的解决方案,将其推迟到GC。不幸的是,虽然这在微基准测试中看起来很快,但由于导致停止世界GC抖动,它在实践中的性能很糟糕。基于大小的解决方案必须适应这项工作,这并不理想。咖啡因针对基于大小的优化,还获得了改进的哈希表,而Guava处理引用缓存更优雅。
Caffeine不会为维护或过期创建自己的线程。它确实将成本推迟到公共池
,这略微提高了面向用户的延迟,但没有提高吞吐量。未来的版本可能会利用CompletableFuture. delayedExecator
来安排下一个过期事件,而无需直接创建线程(适用于具有依赖于提示删除通知的业务逻辑的用户)。
并发LinkedHashMap
和MapMaker
是同时编写的,CLHM的性能与咖啡因相似。我相信这种差异是由于设计者喜欢和优化的场景,这影响了其他功能的实现方式。有低垂的果实可以让Guava拥有类似的性能配置文件,但没有内部冠军来推动这一点(咖啡因作为受欢迎的替代方案更是如此)。