[Libreoffice-commits] online.git: kit/Kit.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Nov 28 04:59:10 UTC 2016
kit/Kit.cpp | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
New commits:
commit ef9ab9458027d5ed3480447725f54aa51d180a40
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Sun Nov 27 00:59:04 2016 -0500
loolwsd: less aggressive png cache eviction
The overall hit-rate improves significantly
when we don't remove entries too soon.
Here we give entries more time to show their
merrit.
There are now two limits, soft and hard.
The former is used to remove entries with no
hits at all, while the latter is used to
avoid overflowing the cache footprint too
much. Entries also get started with a single
hit, which prevents them getting evicted
too soon (i.e. right after getting added).
Finally, there is no longer need to reduce
the hit count of entries too agressively
since we have two tiers (soft and hard limits)
and zero-hit entries are removed before others.
The average cache size while auto-typing in
Writer doc is less than 180kb, which is 1.4x
the original size of 128kb.
Change-Id: I946318151638c9c64c714190084c492f9098852b
Reviewed-on: https://gerrit.libreoffice.org/31291
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/kit/Kit.cpp b/kit/Kit.cpp
index 68099cf..0836b1e 100644
--- a/kit/Kit.cpp
+++ b/kit/Kit.cpp
@@ -271,13 +271,15 @@ class PngCache
size_t _hitCount;
CacheData _data;
CacheEntry(size_t defaultSize) :
- _hitCount(0),
+ _hitCount(1), // Every entry is used at least once; prevent removal at birth.
_data( new std::vector< char >() )
{
_data->reserve( defaultSize );
}
} ;
size_t _cacheSize;
+ static const size_t CacheSizeSoftLimit = (1024 * 4 * 32); // 128k of cache
+ static const size_t CacheSizeHardLimit = CacheSizeSoftLimit * 2;
size_t _cacheHits;
size_t _cacheTests;
std::map< uint64_t, CacheEntry > _cache;
@@ -286,7 +288,7 @@ class PngCache
{
// A normalish PNG image size for text in a writer document is
// around 4k for a content tile, and sub 1k for a background one.
- if (_cacheSize > (1024 * 4 * 32) /* 128k of cache */)
+ if (_cacheSize > CacheSizeHardLimit)
{
size_t avgHits = 0;
for (auto it = _cache.begin(); it != _cache.end(); ++it)
@@ -299,14 +301,18 @@ class PngCache
for (auto it = _cache.begin(); it != _cache.end();)
{
- if (it->second._hitCount <= avgHits)
+ if ((_cacheSize > CacheSizeSoftLimit && it->second._hitCount == 0) ||
+ (_cacheSize > CacheSizeHardLimit && it->second._hitCount > 0 && it->second._hitCount <= avgHits))
{
+ // Shrink cache when we exceed the size to maximize
+ // the chance of hitting these entries in the future.
_cacheSize -= it->second._data->size();
it = _cache.erase(it);
}
else
{
- it->second._hitCount /= 2;
+ if (it->second._hitCount > 0)
+ it->second._hitCount--;
++it;
}
}
More information about the Libreoffice-commits
mailing list