Skip to content

Investigate whether LFU can achieve better performance than LRU caches  #4073

Open
@LifeIsStrange

Description

@LifeIsStrange

WebRender has a LRU cache implementation here https://github.com/servo/webrender/blob/1175acad2d4f49fa712e105c84149ac7f394261d/webrender/src/lru_cache.rs
And it is used for the texture cache and for the gpu cache, which should be quite performance critical.

There is a better kind of cache in theory: the LFU
While it is better in theory, in practice implementation had a worse algorithimical complexity. But there is a paper from 2010 that shows how you can implement a LFU cache in a 0(1) way, effectively achieving the same complexity as LRU while doing smarter, less harmful evictions.
This blog explain it better than I could:
https://arpitbhayani.me/blogs/lfu

So I believe that this might be an interesting "low" hanging fruit that could increase performance on average. Also this optimization idea is general and could affect other programs inside gecko (beyond webrender).

Prior art in rust: https://github.com/bodagovsky/LFUcache

Edit:
I thought about it a little bit more and actually quite obviously:
Recency and frequency are both useful, mostly hortogonal informations.
I believe (but you are the experts) that both can be useful for a gpu cache.
It might be worth investigating whether a LFU would give more performance than a LRU.
But ultimately, we could have the best of both worlds:
"LFU is sometimes combined with a LRU and called LRFU."
http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=970573&isnumber=20937

See also the LRFU section on wiki https://en.m.wikipedia.org/wiki/Cache_replacement_policies

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions