我正在研究实现LIRS缓存算法(如wikipedia和this paper中所述),但是源代码很难遵循,从描述中省略了某些情况。引用example (e) on wikipedia,其中引用了以前未知的元素,看起来该元素被添加为常驻HIR,而没有任何元素从LIRS中删除。这表明我可以继续引用独特元素,并永远成长LIRS。是这种情况......?这看起来很糟糕,因为引用可能会破坏使用应用程序的内存。我错过了什么吗?
另外,如果有人知道LIRS的任何有趣的替代方案都有很好的描述,我很想知道它们 - 做一些编程来赶上我的C ++,而缓存是我一直在研究的主题: )
答案 0 :(得分:0)
是的,这两篇文章没有提到明确的界限。然而,作者向我提供了他们的模拟器,它有一个bound parameter。许多实现都有内存泄漏(例如Clojure's,Infinispan)。
不幸的是,天真的修剪很昂贵,因为它需要很长的堆叠步行。 Thomas Mueller的implementation使用辅助队列进行非常驻条目。这会增加每个条目的成本,但在我的基准测试中显着提高了运行时性能。
不幸的是,我遇到的所有实现都与作者的模拟器不匹配。这是因为某些细节很容易被遗漏(如预热)或未提及(不要在相关参考上进行推广)。在针对模拟器调试跟踪后,mine接近完美并包含了Thomas的优化。如果我将其用于缓存,它的目的是准确和可读。
我引入了一个允许窗口来改善其在新近度偏斜轨迹中的性能,而是选择了TinyLFU。作者和我正在尝试基于简单爬山的自适应窗口来取代静态配置。此article,slides和simulations应简要介绍该政策。读者实现了最小C++ port。