----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: http://git.reviewboard.kde.org/r/104052/#review10848 -----------------------------------------------------------
kdecore/util/kshareddatacache.cpp <http://git.reviewboard.kde.org/r/104052/#comment8778> 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. - Aaron J. Seigo 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 > >