面试题答案
一键面试对LRU和LFU缓存策略的理解
- LRU(Least Recently Used)
- 概念:LRU缓存策略是基于“最近最少使用”原则,当缓存已满且需要新的空间时,它会淘汰掉最近最长时间没有被使用的缓存数据。
- 实现:通常可以使用双向链表和哈希表来实现。双向链表用于记录数据的使用顺序,哈希表用于快速定位数据在链表中的位置。每次访问数据时,将数据移动到链表头部;当缓存满需要淘汰数据时,从链表尾部删除数据。
- LFU(Least Frequently Used)
- 概念:LFU缓存策略是基于“最少频率使用”原则,当缓存已满且需要新的空间时,它会淘汰掉使用频率最低的数据。如果存在多个使用频率相同的缓存数据,则淘汰其中最久未使用的(作为第二判断条件,类似于LRU的思想)。
- 实现:实现相对复杂,一般需要维护一个哈希表用于快速定位数据,同时还需要维护一个频率表,记录每个数据的使用频率。每次访问数据时,更新其使用频率,并在缓存满时,从频率表中找出频率最低的且最久未使用的数据进行淘汰。
在图形渲染场景下缓存策略的选择及原因
- 选择LRU
- 原因:在图形渲染场景中,往往具有较强的时间局部性。例如,在渲染动画或游戏场景时,最近渲染过的图形元素很可能在短时间内再次被渲染。比如角色的皮肤纹理、常用的建筑模型等,一旦被加载到缓存中,在当前的游戏关卡或动画片段中,可能会被频繁使用。LRU策略能够很好地适应这种时间局部性,优先保留最近使用过的图形数据,淘汰长时间未使用的,这样可以有效减少图形数据的重复加载和渲染,提高渲染效率。
- 相比LFU的优势:LFU在图形渲染场景中的适用性相对较差。虽然LFU考虑了使用频率,但在图形渲染中,图形元素的使用频率可能受场景变化影响较大。例如,某个复杂的特效图形在某一关卡只出现一次,但计算量很大,按照LFU它可能很快被淘汰,但如果后续关卡又需要使用,就会导致性能问题。而LRU更注重近期的使用情况,能更好地应对这种场景的变化,保持较好的渲染性能。