Я еще не разобрался в проблеме, но могу поделиться некоторыми соображениями.
Как и в случае с Кусаланандой, вызов find | grep
явно быстрее в моей системе, что не имеет особого смысла. Сначала я предположил какую-то проблему с буферизацией; что запись в консоль замедляет время до следующего системного вызова для чтения следующего имени файла. Запись в канал происходит очень быстро :около 40 МБ/с даже для 32 -байт записи (в моей довольно медленной системе; 300 МБ/с для блока размером 1 МБ ). Таким образом, я предположил, что find
может быстрее читать из файловой системы при записи в канал (или файл ), так что две операции чтения путей к файлам и записи в консоль могут выполняться параллельно (, что find
поскольку однопоточный процесс не может выполняться сам по себе.
Это find
виноват
Сравнение двух вызовов
:> time find "$HOME"/ -name '*.txt' >/dev/null
real 0m0.965s
user 0m0.532s
sys 0m0.423s
и
:> time find "$HOME"/ >/dev/null
real 0m0.653s
user 0m0.242s
sys 0m0.405s
показывает, что find
делает что-то невероятно глупое, (что бы это ни было ). Он просто оказывается совершенно некомпетентным в выполнении -name '*.txt'
.
Может зависеть от отношения вход/выход
Можно подумать, что find -name
выигрывает, если писать очень мало. Но это становится еще более неловким для find
. Проигрывает даже если вообще нечего писать против 200K файлов (13M pipe data )дляgrep
:
time find /usr -name lwevhewoivhol
find
может быть таким же быстрым, как grep
,хотя
Оказывается, тупость find
с name
не распространяется на другие тесты. Вместо этого используйте регулярное выражение, и проблема исчезнет:
:> time find "$HOME"/ -regex '\.txt$' >/dev/null
real 0m0.679s
user 0m0.264s
sys 0m0.410s
Думаю, это можно считать ошибкой. Есть желающие написать отчет об ошибке? Моя версия find (GNU findutils )4.6.0
«Настройка» заключается в том, что root
и toor
имеют идентификатор пользователя 0, что определяет, что это суперпользователь.
На это намекает заголовок этого раздела часто задаваемых вопросов FreeBSD: «Что это за учетная запись UID 0 toor
? Я был скомпрометирован?»