KDE/kdelibs/kdeui/icons

David Faure faure at kde.org
Mon Aug 16 18:31:41 CEST 2010


SVN commit 1164379 by dfaure:

Optimizations:
- Remove duplicates in the list of paths, before checking every path for icon themes
- Add missing slash, so that we don't look for /usr/share/pixmapsoxygen (doh)
- Factorize the code that looks for index.desktop or index.theme so that we call access+stat only once.

Results of strace -e trace=open,access,stat ./kiconloader_unittest >& log:
 Before: 82598 * access, 22518 * stat, 1082 * open
  After: 73798 * access, 16694 * stat, 1082 * open

CCMAIL: kde-optimize at kde.org
CCBUG: 240009


 M  +4 -3      kiconcache.cpp  
 M  +17 -16    kicontheme.cpp  


--- trunk/KDE/kdelibs/kdeui/icons/kiconcache.cpp #1164378:1164379
@@ -190,16 +190,17 @@
 {
     // Find all possible icontheme dirs
     // This has been taken from kicontheme.cpp
-    const QStringList icondirs = KGlobal::dirs()->resourceDirs("icon")
+    QStringList icondirs = KGlobal::dirs()->resourceDirs("icon")
             << KGlobal::dirs()->resourceDirs("xdgdata-icon")
-            << "/usr/share/pixmaps"
+            << "/usr/share/pixmaps/"
             // These are not in the icon spec, but e.g. GNOME puts some icons there anyway.
             << KGlobal::dirs()->resourceDirs("xdgdata-pixmap");
+    icondirs.removeDuplicates();
 
     // Check which of theme actually contain existing dir of one of the
     //  given themes
     QSet<QString> dirs;
-    for (QStringList::ConstIterator it = icondirs.begin(); it != icondirs.end(); ++it) {
+    for (QStringList::ConstIterator it = icondirs.constBegin(); it != icondirs.constEnd(); ++it) {
         QStringList::ConstIterator themeIt;
         for (themeIt = themeNames.begin(); themeIt != themeNames.end(); ++themeIt) {
             QString dirName = *it + *themeIt + '/';
--- trunk/KDE/kdelibs/kdeui/icons/kicontheme.cpp #1164378:1164379
@@ -133,7 +133,6 @@
     QStringList icnlibs;
     QStringList::ConstIterator it, itDir;
     QStringList themeDirs;
-    QString cDir;
     QSet<QString> addedDirs; // Used for avoiding duplicates.
 
     // Applications can have local additions to the global "locolor" and
@@ -144,7 +143,7 @@
        ( name == defaultThemeName() || name== "hicolor" || name == "locolor" ) ) {
         icnlibs = KGlobal::dirs()->resourceDirs("data");
         for (it=icnlibs.constBegin(); it!=icnlibs.constEnd(); ++it) {
-            cDir = *it + appName + "/icons/" + name;
+            const QString cDir = *it + appName + "/icons/" + name;
             if (QFile::exists( cDir )) {
                 themeDirs += cDir + '/';
             }
@@ -154,33 +153,35 @@
 
     icnlibs = KGlobal::dirs()->resourceDirs("icon")
         << KGlobal::dirs()->resourceDirs("xdgdata-icon")
-        << "/usr/share/pixmaps"
+        << "/usr/share/pixmaps/"
         // These are not in the icon spec, but e.g. GNOME puts some icons there anyway.
         << KGlobal::dirs()->resourceDirs("xdgdata-pixmap");
+    icnlibs.removeDuplicates();
+
+    QString fileName, mainSection;
     for (it=icnlibs.constBegin(); it!=icnlibs.constEnd(); ++it) {
-        cDir = *it + name + '/';
+        const QString cDir = *it + name + '/';
         if (KStandardDirs::exists(cDir)) {
             themeDirs += cDir;
-            if (d->mDir.isEmpty() &&
-                (KStandardDirs::exists( cDir + "index.desktop") || KStandardDirs::exists( cDir + "index.theme"))) {
+            if (d->mDir.isEmpty()) {
+                if (KStandardDirs::exists(cDir + "index.desktop")) {
                 d->mDir = cDir;
+                    fileName = d->mDir + "index.desktop";
+                    mainSection = "KDE Icon Theme";
+                } else  if (KStandardDirs::exists(cDir + "index.theme")) {
+                    d->mDir = cDir;
+                    fileName = d->mDir + "index.theme";
+                    mainSection = "Icon Theme";
             }
         }
     }
+    }
 
     if (d->mDir.isEmpty()) {
-        kDebug(264) << "Icon theme " << name << " not found.\n";
+        kDebug(264) << "Icon theme" << name << "not found.";
         return;
     }
 
-    QString fileName, mainSection;
-    if (QFile::exists(d->mDir + "index.desktop")) {
-        fileName = d->mDir + "index.desktop";
-        mainSection="KDE Icon Theme";
-    } else {
-        fileName = d->mDir + "index.theme";
-        mainSection="Icon Theme";
-    }
     // Use KSharedConfig to avoid parsing the file many times, from each kinstance.
     // Need to keep a ref to it to make this useful
     d->sharedConfig = KSharedConfig::openConfig(fileName);
@@ -207,7 +208,7 @@
         KConfigGroup cg(d->sharedConfig, *it);
         for (itDir=themeDirs.constBegin(); itDir!=themeDirs.constEnd(); ++itDir) {
             const QString currentDir(*itDir + *it + '/');
-            if (KStandardDirs::exists(currentDir) && !addedDirs.contains(currentDir)) {
+            if (!addedDirs.contains(currentDir) && KStandardDirs::exists(currentDir)) {
                 addedDirs.insert(currentDir);
                 KIconThemeDir *dir = new KIconThemeDir(*itDir, *it, cg);
                 if (!dir->isValid()) {


More information about the Kde-optimize mailing list