Как вы знаете, есть опция для команды find которая позволяет вам определить, ищете ли вы «файл» или «каталог». Мне было интересно, если указать, что улучшит производительность поиска (скорость)? лайк:

find / -type file -name foo.bar

быстрее чем

find / -name foo.bar

или это не имеет никакого значения?

2 ответа2

2
  1. Ваши команды даже не будут работать по двум причинам:

    • Начальный каталог (или каталоги), если таковые имеются, всегда должен появляться перед тестами, если таковые имеются, поэтому ваши команды должны быть

      find / -name foo.bar …
      
    • Обычно вы не можете сказать -type file ; это должно быть -type f

  2. Почему вы даже подозреваете, что добавление дополнительного теста улучшит производительность?
  3. Теоретически, это может снизить производительность, потому что вы делаете

    if (filename = "foo.bar"  AND  filetype = "f")
        print filename
    

    вместо

    if (filename = "foo.bar")
        print filename
    

    то есть вы даете ему больше работы.  В действительности, однако, разница будет незначительной.  команда find уже должна получить информацию о типе файла, чтобы увидеть, какие записи являются каталогами (и, следовательно, их необходимо искать рекурсивно).  Как только он получит эту информацию, проверка того, является ли он простым файлом, требует всего лишь нескольких инструкций ЦП и выполняется очень быстро.

1

Да, в некоторых случаях это улучшает производительность.

По умолчанию find применяет логические AND к своим тестам, но последний тест не оценивается, если первый равен false. Таким образом, если вы добавите супер быстрый тест, который почти всегда дает сбой в самом начале, он может сохранить множество выполнений следующих (скажем, медленных) тестов, и в этом случае этот дополнительный тест действительно повышает производительность.

Перейдите в каталог с большим количеством файлов и несколькими символическими ссылками. сравнить

time find -exec test -L {} \; -print

в

time find -type l -exec test -L {} \; -print

Это искусственный, но поучительный пример. Два теста (-type l и -exec test -L {} \;) выполняют одинаковую работу, две команды find дают одинаковые результаты. Однако -exec создает дополнительный процесс, и это относительно медленно. В моем домашнем каталоге первая команда занимает две минуты; вторая команда занимает шесть секунд.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .