KDE/kdelibs/kded
David Faure <[email protected]> Mon, 19 Jul 2010 19:46:54 +0200 (CEST)
| Newsgroups | gmane.comp.kde.devel.optimize |
|---|---|
| Message-ID | <[email protected]> |
SVN commit 1151848 by dfaure: Make mimetype parsing 29% faster by using QXmlStreamReader instead of QDomDocument before: 1962378 instructions per createEntry, 570 ms total (for kbuildsycoca --noincremental) after: 1378515 instructions per createEntry, 410 ms total (for kbuildsycoca --noincremental) Impact on the overall kbuildsycoca --noincremental run: 8% speedup, and mimetype parsing went down from 26% of the total cpu time to 20.2% of the now-shorter cpu time, moving it below KConfig parsing and ksycoca saving. CCMAIL: [email protected] M +21 -17 kbuildmimetypefactory.cpp --- trunk/KDE/kdelibs/kded/kbuildmimetypefactory.cpp #1151847:1151848 @@ -31,7 +31,7 @@ #include <kdesktopfile.h> #include <QtCore/QHash> #include <QtCore/QFile> -#include <QtXml/QDomAttr> +#include <QXmlStreamReader> KBuildMimeTypeFactory::KBuildMimeTypeFactory() : KMimeTypeFactory(), m_parser(this), @@ -112,42 +112,46 @@ QFile qfile(fullPath); if (!qfile.open(QFile::ReadOnly)) continue; - QDomDocument doc; - if (!doc.setContent(&qfile)) { - kWarning() << "Parse error in " << fullPath; + + QXmlStreamReader xml(&qfile); + if (xml.readNextStartElement()) { + if (xml.name() != "mime-type") { continue; } - const QDomElement mimeTypeElement = doc.documentElement(); - if (mimeTypeElement.tagName() != "mime-type") - continue; - name = mimeTypeElement.attribute("type"); + name = xml.attributes().value("type").toString(); if (name.isEmpty()) continue; - for ( QDomElement e = mimeTypeElement.firstChildElement(); - !e.isNull(); - e = e.nextSiblingElement() ) { - const QString tag = e.tagName(); + while (xml.readNextStartElement()) { + const QStringRef tag = xml.name(); if (tag == "comment") { - QString lang = e.attribute("xml:lang"); + QString lang = xml.attributes().value("xml:lang").toString(); + const QString text = xml.readElementText(); if (lang.isEmpty()) { - comment = e.text(); + comment = text; lang = "en"; } - commentsByLanguage.insert(lang, e.text()); + commentsByLanguage.insert(lang, text); + continue; // we called readElementText, so we're at the EndElement already. } else if (tag == "icon") { // as written out by shared-mime-info >= 0.40 - userIcon = e.attribute("name"); + userIcon = xml.attributes().value("name").toString(); } else if (tag == "glob-deleteall") { // as written out by shared-mime-info > 0.60 mainPattern.clear(); m_parsedMimeTypes[name] = QString(); } else if (tag == "glob" && mainPattern.isEmpty()) { // as written out by shared-mime-info > 0.60 - const QString pattern = e.attribute("pattern"); + const QString pattern = xml.attributes().value("pattern").toString(); if (pattern.startsWith('*')) { mainPattern = pattern; } } + xml.skipCurrentElement(); } + if (xml.name() != "mime-type") { + kFatal() << "Programming error in KBuildMimeTypeFactory::createEntry, please create a bug report on http://bugs.kde.org and attach the file" << fullPath; } + } + } + if (name.isEmpty()) { return 0; }