[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    KIconLoader patch
From:       Geert Jansen <g.t.jansen () stud ! tue ! nl>
Date:       2000-07-21 12:05:39
[Download RAW message or body]

Hi!

I've been investigating various optimisations to KIconLoader. The final 
results are:

[kde2] greet:~/kde/CVS/kdelibs/kdecore> ./stats konq-*-nopath

file: konq-4img-nopath
datapoints: 99
mean value: 2352.192627
std. dev.: 30.627594
 
file: konq-noimg-nopath
datapoints: 100
mean value: 2374.019287
std. dev.: 19.582916   

Conclusions:

* The best results I found are have an iconloder with an image cache of 4
   images. A bigger cache didn't have a positive effect on konqy's startup
   time. The gain is a shallow 22 ms. On NFS, I expect to see a much bigger
   performance impact.

* A path cache didn't have any influence.

The patch implementing the image cache is appended to this email. If it's 
ok with you, I'd like to commit it.

Greetings,
Geert

Index: kiconloader.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdecore/kiconloader.cpp,v
retrieving revision 1.137
diff -u -r1.137 kiconloader.cpp
--- kiconloader.cpp     2000/07/19 11:17:11     1.137
+++ kiconloader.cpp     2000/07/21 11:42:43
@@ -21,6 +21,7 @@
 #include <qfileinfo.h>
 #include <qdir.h>
 #include <qiconset.h>
+#include <qcache.h>

 #include <kdebug.h>
 #include <kstddirs.h>
@@ -126,7 +127,7 @@
     KIconThemeNode *mpThemeRoot;
     KStandardDirs *mpDirs;
     KIconEffect mpEffect;
-    QDict<QImage> imgDict;
+    QCache<QImage> imgCache;
 };


@@ -199,10 +200,12 @@
     for (QStringList::ConstIterator it = dirs.begin(); it != dirs.end(); 
it++)
        d->mpDirs->addResourceDir("appicon", *it);

+    d->imgCache.setMaxCost(4);
+    d->imgCache.setAutoDelete(true);
+
     QString dbgString = "Theme tree: ";
     d->mpThemeRoot->printTree(dbgString);
     kdDebug(264) << dbgString << endl;
-
 }

 KIconLoader::~KIconLoader()
@@ -455,9 +458,8 @@
 
     // Generate a unique cache key for the icon.
 
-    key = "$kico_";
-    key += name; key += "_";
-    key += QString().setNum(size); key += "_";
+    QString basekey = QString("%1_%2_").arg(name).arg(size);
+    key = "$kico_"; key += basekey;
     if (group >= 0)
     {
        key += d->mpEffect.fingerprint(group, state);
@@ -496,10 +498,20 @@
     if (inCache)
        return pix;
 
-    QImage img(icon.path);
-    if (img.isNull())
-       return pix;
-
+    // Try to load image from the image cache.
+    QImage *imgptr = d->imgCache.find(basekey);
+    if (imgptr == 0L)
+    {
+       imgptr = new QImage(icon.path);
+       if (imgptr->isNull())
+       {
+           delete imgptr;
+           return pix;
+       }
+       d->imgCache.insert(basekey, imgptr);
+    }
+    QImage img = *imgptr; // copy, image might be changed.
+
     // Blend in all overlays
     if (overlay)
     {
@@ -537,9 +549,12 @@
 
 QImage *KIconLoader::loadOverlay(const QString &name, int size) const
 {
-    QImage *image = d->imgDict.find(name);
+    QString key = QString("%1_%2_").arg(name).arg(size);
+    QImage *image = d->imgCache.find(key);
     if (image != 0L)
+    {
        return image;
+    }
 
     KIcon icon = findMatchingIcon(name, size);
     if (!icon.isValid())
@@ -548,7 +563,7 @@
        return 0L;
     }
     image = new QImage(icon.path);
-    d->imgDict.insert(name, image);
+    d->imgCache.insert(key, image);
     return image;
 } 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic