Почему передача в cat происходит быстрее, чем не передача в cat?

Я только что узнал, что выполнение find . медленнее, чем выполнение find . | cat. Вот результаты выполнения time find . 3 раз в моем домашнем каталоге:

First:
real    0m4.385s
user    0m0.546s
sys     0m2.072s

Second:
real    0m4.090s
user    0m0.514s
sys     0m1.798s

Third:
real    0m4.197s
user    0m0.508s
sys     0m1.905s

Выполнение time find . | cat вместо этого значительно улучшает результаты:

First:
real    0m2.988s
user    0m0.378s
sys     0m1.649s

Second:
real    0m2.768s
user    0m0.370s
sys     0m1.471s

Third:
real    0m2.768s
user    0m0.370s
sys     0m1.471s

Как видите, find . | cat намного быстрее. Я действительно смущен этим, единственное, что делает cat, это копирует свой ввод в вывод, верно? Я действительно понятия не имею, почему это происходит, и я был бы счастлив, если бы кто-нибудь мог сказать мне, почему это так.

Для справки, вот вывод find . | wc:

 246646  477986 25198490

Спасибо.


person Loovjo    schedule 28.06.2015    source источник
comment
@LucasTrzesniewski: Нет. В bash time принимает конвейер в качестве аргумента, а не сигнальную команду.   -  person choroba    schedule 28.06.2015
comment
@choroba мой плохой, не знал, что это встроенная оболочка   -  person Lucas Trzesniewski    schedule 28.06.2015
comment
Как вы на самом деле делаете тесты времени? Интересно, может ли кеширование иметь какое-то отношение к этому. Что касается меня, я обнаружил, что первый раз, когда я делаю find ., самый медленный, независимо от того, передаю ли я его через cat. Второе заклинание, и последующие (наверное пока кэш не промахнется) быстрее   -  person Eric Renouf    schedule 29.06.2015


Ответы (1)


Вызов find . сам по себе не медленнее, чем find . | cat. Это только медленнее, когда вы печатаете вывод на стандартный вывод. Когда вы перенаправляете вывод на /dev/null (в частности, вызывая find . > /dev/null и find . | cat > /dev/null), вы должны заметить, что с | cat медленнее, чем без него.

Единственный вывод, который приходит мне на ум из этих результатов, заключается в том, что, когда cat запускает отдельный процесс для печати, команда find не задерживается, блокируя печать в stdout, тогда как cat работает как отдельный процесс, и поэтому, когда он задержал печать до stdout, команда find все еще работает, фактически находя файлы.

person forkrul    schedule 03.07.2015