为什么管道进入猫的速度要快于对猫的管道?

时间:2015-06-28 16:08:52

标签: bash performance pipe sh 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

感谢。

1 个答案:

答案 0 :(得分:3)

find .的调用本身并不比find . | cat慢。将输出打印到stdout时速度会慢一些。 当您将输出重定向到/dev/null(特别是调用find . > /dev/nullfind . | cat > /dev/null)时,您应该注意到| cat比没有更慢。

从这些结果中我想到的唯一结论是,通过让cat运行单独的打印过程,find命令不会被阻止打印到stdout,而cat作为一个单独的进程运行,因此当它被阻止打印到stdout时,find命令仍在运行,实际上正在查找文件。