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

List:       kde-optimize
Subject:    Mimetype optimization
From:       Jakub Stachowski <qbast () go2 ! pl>
Date:       2008-04-22 18:06:57
Message-ID: 200804222006.58114.qbast () go2 ! pl
[Download RAW message or body]

Hello,

profiling dolphin while opening /usr/bin shows that about 35% of time is spent 
in QRegExp matching called by kmimefactory.cpp: matchFileName. This function 
already contains optimizations: for some simple (but popular) patterns like 
*.something or something* it uses direct comparision instead of QRegExp big 
gun. It looks like:
   if (pattern like *.something && filename long enough to match the pattern)  
compare directly;. 
However for short names (lots of them in /usr/bin) it often falls back to slow 
path. Attached patch changes is to:
if (pattern like *.something) { 
	if (filename not long enough to match) return false;
	else compare directly;
}

and detects patterns without wildcards (is checking for *,? and ] enough?)

Results (measured by callgrind):
Unpatched, for 179 calls to KMimeTypeFactory::findFromFileName
- 5554 calls to QRegExp::exactMatch, which accounts for 35% of CPU time

Patched,  for 150 calls to KMimeTypeFactory::findFromFileName
- QRegExp matched 13 times.  findFromFileName takes 0.67% of CPU time


["mimefactory.patch" (text/x-diff)]

Index: kmimetypefactory.cpp
===================================================================
--- kmimetypefactory.cpp	(wersja 799070)
+++ kmimetypefactory.cpp	(kopia robocza)
@@ -190,8 +190,10 @@
     int len = filename.length();
 
     // Patterns like "*~", "*.extension"
-    if (pattern[0] == '*' && len + 1 >= pattern_len && pattern.indexOf('[') == -1)
+    if (pattern[0] == '*'  && pattern.indexOf('[') == -1)
     {
+        if ( len + 1 < pattern_len ) return false;
+    
         const QChar *c1 = pattern.unicode() + pattern_len - 1;
         const QChar *c2 = filename.unicode() + len - 1;
         int cnt = 1;
@@ -201,7 +203,8 @@
     }
 
     // Patterns like "README*" (well this is currently the only one like that...)
-    if (pattern[pattern_len - 1] == '*' && len + 1 >= pattern_len) {
+    if (pattern[pattern_len - 1] == '*') {
+        if ( len + 1 < pattern_len ) return false;
         if (pattern[0] == '*')
             return filename.indexOf(pattern.mid(1, pattern_len - 2)) != -1;
 
@@ -213,7 +216,11 @@
         return cnt == pattern_len;
     }
 
-    // Other patterns, like "[Mm]akefile" or "README": use slow but correct method
+    // Names without any wildcards like "README"
+    if (pattern.indexOf('[') == -1 && pattern.indexOf('*') == -1 && pattern.indexOf('?')) 
+        return (pattern == filename);
+
+    // Other patterns, like "[Mm]akefile": use slow but correct method
     QRegExp rx(pattern);
     rx.setPatternSyntax(QRegExp::Wildcard);
     return rx.exactMatch(filename);


_______________________________________________
Kde-optimize mailing list
Kde-optimize@kde.org
https://mail.kde.org/mailman/listinfo/kde-optimize


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

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