оптимизация "найти" - PullRequest
       7

оптимизация "найти"

1 голос
/ 16 декабря 2009
'find ./ -name *.jpg'

Я пытаюсь оптимизировать команду 'find' для приведенного выше оператора.

метод, который обрабатывает предикат '-name' в реализации find.


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, base, flags) == 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. Есть ли лучший способ оптимизировать поиск для поиска только по расширениям файлов?

1 Ответ

5 голосов
/ 16 декабря 2009

Я сомневаюсь, что соответствие регулярному выражению является узким местом. Поскольку find пересекает файловую систему, накладные расходы, вероятно, приходятся на время поиска диска, а в случае файловой системы в памяти - на системные вызовы и результирующие переключения контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...