Review Request: KImageCache optimization

Mark Gaiser markg85 at gmail.com
Thu Feb 23 20:59:58 GMT 2012



> On Feb. 23, 2012, 7:57 p.m., Aaron J. Seigo wrote:
> > kdecore/util/kshareddatacache.cpp, lines 1488-1496
> > <http://git.reviewboard.kde.org/r/104052/diff/2/?file=50863#file50863line1488>
> >
> >     looking at it again, it appears there is room for one more small optimization when destination is null in find(..). if this not a common case, it may not be worthwhile, but it might look sth like:
> >     
> >     if (destination) {
> >          QByteArray temp;
> >          const bool success = rawFind(key, &temp);
> >          if (success && destination && !temp.isNull()) {
> >              *destination = QByteArray(temp.constData(), temp.size());
> >          }
> >          return success;
> >     } else {
> >        return rawFind(key, 0);
> >     }
> >     
> >     as this is code in hot-paths it would be nice to make this as efficient as possible without destroying readability/maintainability.

:) Adjusted. If you have another optimization.. please do tell. Otherwise i will update the diff within a few hours. This is how the function looks now:

bool KSharedDataCache::find(const QString &key, QByteArray *destination) const
{
    if (destination) {
        QByteArray temp;
        const bool success = rawFind(key, &temp);
        if (success && destination && !temp.isNull()) {
            *destination = QByteArray(temp.constData(), temp.size());
        }
        return success;
    } else {
        return rawFind(key, 0);
    }
}

Compiles and tested. All pass.
note: rawFind could perhaps use some optimizations as well ;) (and perhaps the internal functions findNamedEntry(..) and page(..)


- Mark


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/104052/#review10848
-----------------------------------------------------------


On Feb. 23, 2012, 7:23 p.m., Mark Gaiser wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/104052/
> -----------------------------------------------------------
> 
> (Updated Feb. 23, 2012, 7:23 p.m.)
> 
> 
> Review request for kdelibs, David Faure and Michael Pyne.
> 
> 
> Description
> -------
> 
> I was running KWin through callgrind to see where possible bottlenecks are. I wasn't expecting much since it improved greatly during the 4.8 dev cycle, however one stood out. The saving of PNG images was taking about 1/5th of the time in KWin that i could see directly. That looked like something i might be able to optimize.
> 
> What this patch is doing is storing the actual image bits to prevent saving a PNG image to the mmapped cache. That was a hot code path in time (cycles), not even in calls. I've also reduced the amount of memory copies to a bare minimum by adding a rawFind function to KSharedDataCache which fills a QByteArray::fromRawData thus preventing a expensive memory copy. The rawFind is used for looking up an image and fetching it's data without copying it. That is done because QImage seems to make a copy itself internally. I don't have any performance measurements, however, prior to this patch my kwin test was using up ~5.000.000.000 cycles. After this patch it's using up 1.370.000.000. I don't have raw performance numbers to see if the cache itself is actually faster, it certainly has become a lot cheaper to use the cache. Logic wise i would say creating a QImage from the cached data should be way faster now since there is no step involved anymore in decoding the image. Storing is certainly an order of magnitude faster.
> 
> Benchmark numbers. insert(write) and find(read)
> 
> -- Before patch --
> READ : 0.019 msecs per iteration (total: 79, iterations: 4096)
> WRITE: 0.010 msecs per iteration (total: 88, iterations: 8192)
> 
> -- After patch --
> READ : 0.019 msecs per iteration (total: 79, iterations: 4096)
> WRITE: 0.0026 msecs per iteration (total: 87, iterations: 32768)
> 
> Reading is equal in speed, writing is ~5x faster after the patch.
> 
> Special thanks go to David Faure for helping me a great deal with this.
> 
> 
> Diffs
> -----
> 
>   kdecore/util/kshareddatacache.h 339cecc 
>   kdecore/util/kshareddatacache.cpp 9fe3995 
>   kdeui/tests/CMakeLists.txt 63788f6 
>   kdeui/tests/kimagecachetests.h PRE-CREATION 
>   kdeui/tests/kimagecachetests.cpp PRE-CREATION 
>   kdeui/util/kimagecache.cpp a5bbbe1 
> 
> Diff: http://git.reviewboard.kde.org/r/104052/diff/
> 
> 
> Testing
> -------
> 
> I've also written a bunch of test cases (greatly improved by David Faure) to see if i didn't break anything. According to the test (which is also comparing the actual image bits) it's all passing just fine.
> 
> 
> Thanks,
> 
> Mark Gaiser
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20120223/e8d6b69f/attachment.htm>


More information about the kde-core-devel mailing list