Review Request 118587: Optimize KConfigIniBackend::parseConfig by reducing allocations.
Milian Wolff
mail at milianw.de
Sat Jun 7 11:11:50 BST 2014
On June 7, 2014, 10:01 a.m., Milian Wolff wrote:
> > note that you could make it even more efficient with a more drastic approach: have the entry map hold buffer fragments to start with. the entries would also have variants (or at least byte arrays) as a cache for the already-converted (and overwritten) values. that would mean keeping the raw config file in memory, but that shouldn't be significant compared to everything else.
> >
> > i have no idea whether keeping a string table of the converted values on top of that would still add value. it could if the many identical values are actually all used (identical keys should not matter, as they are never converted - unless you enumerate them).
Yes, interesting ideas. But it would mean one has to keep the full config file QByteArray in memory. I'm not sure that is beneficial from a memory usage pov. I think I'll eventually try it out in kf5 land. This was easy to get done for kdelibs 4.
I'll fix the issue you pointed out and try out the improved qHash from Qt5 and resubmit next week.
Thanks!
- Milian
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/118587/#review59498
-----------------------------------------------------------
On June 6, 2014, 11:35 a.m., Milian Wolff wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/118587/
> -----------------------------------------------------------
>
> (Updated June 6, 2014, 11:35 a.m.)
>
>
> Review request for kdelibs, David Faure, Matthew Dawson, and Oswald Buddenhagen.
>
>
> Repository: kdelibs
>
>
> Description
> -------
>
> Optimize KConfigIniBackend::parseConfig by reducing allocations.
>
> Yet another awesome application of the Qt implicit sharing trick.
> Since config files often contain only few different keys and even
> value strings, we can share them. This reduces memory consumption
> and also speeds up parsing, as we do not have to allocate the
> duplicated strings, but can simply reuse the previous values.
>
> The most extreme case for this of my knowledge, is KatePart:
> katesyntaxhighlightingrc has more then 20k lines which triggered
> about 30k allocations on startup. With this patch applied, this
> value goes down dramatically. I added a simple static counter for
> the cache hit/miss ratio, which resulted in 5442 cache misses compared
> to 43624 cache hits across all KConfig files parsed by kwrite on startup.
>
>
> Diffs
> -----
>
> kdecore/config/bufferfragment_p.h 5a753ad
> kdecore/config/kconfigini.cpp 8ec43c5
> kdecore/config/kconfigini_p.h d7aa43e
>
> Diff: https://git.reviewboard.kde.org/r/118587/diff/
>
>
> Testing
> -------
>
> Unit tests all pass. My malloc tracer shows that the allocations are all gone.
>
> My malloc tracer showed before:
>
> 17421 allocations at:
> 0x7fee73692b97 QByteArray::QByteArray(char const*, int) /usr/lib/libQtCore.so.4
> 0x7fee73bb7cee ? /usr/lib/libkdecore.so.5
> 0x7fee73bb7fc4 ? /usr/lib/libkdecore.so.5
> 0x7fee73ba1320 ? /usr/lib/libkdecore.so.5
> 0x7fee73ba1731 KConfig::KConfig(QString const&, QFlags<KConfig::OpenFlag>, char const*) /usr/lib/libkdecore.so.5
> 0x7fee64830c06 KateHlManager::KateHlManager() in /ssd/milian/projects/kde4/kate/part/syntax/katesyntaxmanager.cpp:76 /ssd/milian/projects/compiled/kde4/lib/libkatepartinterfaces.so.4
>
> 12699 allocations at:
> 0x7fee73692b97 QByteArray::QByteArray(char const*, int) /usr/lib/libQtCore.so.4
> 0x7fee73bb7cd7 ? /usr/lib/libkdecore.so.5
> 0x7fee73bb7fc4 ? /usr/lib/libkdecore.so.5
> 0x7fee73ba1320 ? /usr/lib/libkdecore.so.5
> 0x7fee73ba1731 KConfig::KConfig(QString const&, QFlags<KConfig::OpenFlag>, char const*) /usr/lib/libkdecore.so.5
> 0x7fee64830c06 KateHlManager::KateHlManager() in /ssd/milian/projects/kde4/kate/part/syntax/katesyntaxmanager.cpp:76 /ssd/milian/projects/compiled/kde4/lib/libkatepartinterfaces.so.4
>
> These where the allocation hotspots number #1 and #3 respectively. With the patch applied, the two locations are not under the top 10 anymore.
>
>
> Thanks,
>
> Milian Wolff
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20140607/d8b86050/attachment.htm>
More information about the kde-core-devel
mailing list