【问题标题】:Why is piping into cat faster than not piping to cat?为什么管道进入 cat 比不管道进入 cat 更快?
【发布时间】:2015-09-15 02:27:01
【问题描述】:

我刚刚发现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

谢谢。

【问题讨论】:

  • @LucasTrzesniewski:不。在 bash 中,timepipeline 作为参数,而不是信号命令。
  • @choroba 我的错,不知道这是一个内置的 shell
  • 您实际上是如何进行时间测试的?我想知道缓存是否与它有关。对我来说,我发现我第一次做find . 是最慢的,不管我是否通过cat 管道它。第二个咒语,随后(可能直到缓存未命中)更快

标签: bash performance pipe sh cat


【解决方案1】:

find . 的调用本身并不比find . | cat 慢。仅当您将输出打印到标准输出时它会更慢。 当您将输出重定向到/dev/null(特别是调用find . > /dev/nullfind . | cat > /dev/null)时,您应该观察到使用| cat 比不使用要慢。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2021-04-29
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多