CVS commit by brade: Optimize KDirLister updates: Reduce the new/delete operations in slotUpdateResult to the minimum by re-using already allocated memory. It makes updates about 7-8% faster. I had a very brief but inspiring chat with Till at FOSDEM, who suggested to allocate some memory and create/delete all KFileItems in there, which brought me to the idea of re-using the KFileItems themselves. Thanks! M +12 -3 kdirlister.cpp 1.194 --- kdelibs/kio/kio/kdirlister.cpp #1.193:1.194 @@ -1492,5 +1492,5 @@ void KDirListerCache::slotUpdateResult( static const QString& dotdot = KGlobal::staticQString(".."); - KFileItem *item, *tmp; + KFileItem *item = 0, *tmp; QValueList buf = jobs[job]; @@ -1533,5 +1533,8 @@ void KDirListerCache::slotUpdateResult( // Form the complete url + if ( !item ) item = new KFileItem( *it, jobUrl, delayedMimeTypes, true ); + else + item->setUDSEntry( *it, jobUrl, delayedMimeTypes, true ); QString url = item->url().url(); @@ -1555,5 +1558,4 @@ void KDirListerCache::slotUpdateResult( kdl->addRefreshItem( tmp ); } - delete item; // gmbl, this is the most often case... IMPORTANT TODO: speed it up somehow! } else // this is a new file @@ -1561,4 +1563,5 @@ void KDirListerCache::slotUpdateResult( //kdDebug(7004) << "slotUpdateResult: new file: " << name << endl; + item = new KFileItem( *it, jobUrl, delayedMimeTypes, true ); item->mark(); dir->lstItems->append( item ); @@ -1566,7 +1569,13 @@ void KDirListerCache::slotUpdateResult( for ( kdl = listers->first(); kdl; kdl = listers->next() ) kdl->addNewItem( item ); + + // item used, we need a new one for the next iteration + item = 0; } } + if ( item ) + delete item; + jobs.remove( job );