KFilterDev changes from KDE3

David Faure faure at kde.org
Wed Apr 1 21:27:19 BST 2009


On Thursday 19 March 2009, David Faure wrote:
> On Tuesday 17 March 2009, Pino Toscano wrote:
> > Alle martedì 17 marzo 2009, Martin Koller ha scritto:
> > > On Tuesday 17 March 2009, David Faure wrote:
> > > > > Well, I know the mimetype, but as I do a backup of a _lot_ of files,
> > > > > isn't the overhead too high to again and again calling
> > > > > findFilterByMimeType() (as the mimetype will never change during the
> > > > > complete backup) ?
> > > >
> > > > KFilterBase::findFilterByMimeType only loads a mimetype from ksycoca
> > > > (that's supposed to be really fast, just a dict lookup and a bit of
> > > > deserialization) and compares strings. If it really turns out to be a
> > > > bottleneck, we could add a cache in KFilterDev so that it remembers the
> > > > last requested mimetype and the KFilterBase that was created for it (with
> > > > care not to leak or double-delete kfilterbases...). In any case this can
> > > > and should be handled internally in KFilterDev.
> > >
> > > I now run a first test:
> > >
> > > ~18000 files processed: KDE4 3:02 Minutes, KDE3 2:12 Minutes ...
> > >
> > > It _is_ a bottleneck, as this was just a small test.
> > 
> > What about the attached patch?
> > This should avoid the KMimeType deserialization in case the specified mimetype 
> > is either exactly the one of gzip or bzip2, otherwise searching doing the 
> > mimetype lookup as before.
> 
> Good solution with the current API indeed.
> 
> But in fact this is a more general performace problem -- we should have a faster way of checking 
> mimetype inheritance without deserializing a complete mimetype definition first.
> That's already an item on my todo list, actually (iirc this came from profiling "show/hide hidden files" in 
> KFileDialog which was hitting that code path quite a lot, in a $HOME with many hidden files). 
> My idea was to add something like
>   static bool KMimeType::mimeTypeInherits(const QString& mimeType, const QString& possibleParent)
> (better name welcome), which could either look up a specific ksycoca hash, or an in-memory hash
> that contains the result of the parsing of the "subclasses" files from shared-mime-info.
> (First solutions eats less memory but makes kbuildsycoca4 take even longer, even though probably
> not much).

Done, KMimeType::is() is 7 times faster now.

-- 
David Faure, faure at kde.org, sponsored by Qt Software @ Nokia to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).




More information about the kde-core-devel mailing list