2009-12-16 51 views
1
'find ./ -name *.jpg' 

我想優化上面的語句的'發現'命令。'發現'優化

在find實現中處理'-name'謂詞的方法。


static boolean 

pred__name __common (const char *pathname, const char *str, int flags) 

{ 

    boolean b; 

    char *base = base_name (pathname); 

    strip__trailing __slashes(base); 

    b = fnmatch (str, base, flags) == 0; 

    free (base); 

    return b; 

} 

因爲我尋找文件擴展名,並希望避免正則表達式基於字符串匹配,我 '替代B =的fnmatch(STR,基礎上,標誌)== 0;'與以下陳述

int strLen = strlen(base); 

b = FNM_NOMATCH; 

if (strLen>=4 && (str[3] == base[strLen]) && 
    (str[2] == base[strLen -1]) && (str[1] == 
    base[strLen-2]) && (str[0] == base[strLen-3])) 

{ 

b = 0; 

} 

之後,我期望一些性能增益,但我沒有看到上述變化後的任何種類的性能增益。

  1. 是我在做一些事情錯了嗎?
  2. 有沒有更好的方法來優化'查找'以僅搜索文件擴展名?
+0

分析後我在fnmatch上有一些更好的數字 - CPU使用率,fnmatch這個活動佔用了將近16%的CPU。 我認爲,我不能減少運行查找所需的總時間(正如Thomas告訴它的是更多的磁盤活動),但應該可以通過一些更多優化來降低查找的CPU使用率。 – 2009-12-17 06:19:11

回答

5

我懷疑正則表達式匹配是瓶頸。由於find遍歷文件系統,開銷可能是磁盤搜索時間,並且在內存文件系統的情況下,系統調用和結果上下文切換。

+0

如果開銷只在磁盤尋道時間內,那麼CPU使用率不應該是30%。 查找中僅有2個主要部分 1.文件系統迭代(低CPU操作) 2.解析文件(高CPU操作) – 2009-12-16 10:08:43

+1

@kolari:您應該執行一些分析並找出實際花費的時間。只是優化程序的一個隨機部分將無濟於事。 – 2009-12-16 12:14:20

+0

+1表示瓶頸不在模式匹配中。另外,-name開關甚至不會執行完整的正則表達式,它只是執行更簡單的典型shell擴展。 – netjeff 2009-12-16 16:58:35