【问题标题】:Performance of wc -lwc -l 的表现
【发布时间】:2017-04-12 20:34:18
【问题描述】:

我运行了以下命令:

time for i in {1..100}; do find / -name "*.service" | wc -l; done

然后得到 100 行结果:

真正的 0m35.466s 用户 0m15.688s 系统 0m14.552s

然后我运行了以下命令:

time for i in {1..100}; do find / -name "*.service" | awk 'END{print NR}'; done

然后得到 100 行结果:

真正的 0m35.036s 用户 0m15.848s 系统 0m14.056s

我准确地说我之前已经运行了find / -name "*.service",所以它被缓存用于两个命令。

我预计wc -l 会更快。为什么不是?

【问题讨论】:

  • 最初的 find 是缓存目录(inode),而不是内容。
  • find 的结果不会被缓存。
  • @shrimpdrake, ...也就是说,即使有更强大的支持基准,我也不确定这是否是合理的话题。 wc 绝不是“软件开发所独有的”,如 stackoverflow.com/help/on-topic 中所述——因为这两种工具都没有记录在案的性能保证,并且 不存在单一的规范的实现,这实际上不是一个存在规范答案的问题。
  • (如果LC_CTYPE=C,关闭多字节字符支持,是否有任何效果也可能很有趣)。
  • 由于您正在对整个循环进行计时,因此大部分时间可能在find 中,wcawk 之间的差异或多或少地消失在噪音中。

标签: linux bash awk time wc


【解决方案1】:

其他人提到您可能正在计时find,而不是wcawk。尽管如此,wcawk 的不同风格之间可能存在一些有趣的差异。

这是我得到的结果:

Mac OS 10.10.5 awk    0.16m lines/second
GNU awk/gawk 4.1.4    4.4m  lines/second
Mac OS 10.10.5 wc     6.8m  lines/second
GNU wc 8.27          11m    lines/second

我没有使用find,而是在一个大文本文件(66k 行)上循环使用wc -l 或`awk 'END{print NR}'。

我改变了命令的顺序,没有发现任何大到足以改变我报告的排名的偏差。

LC_CTYPE=C 对这些都没有明显的影响。

结论

  1. 不要使用 mac 内置命令行工具,除了少量数据。

  2. GNU wc 在计算行数方面比 GNU awk 快。

我使用 MacPorts GNU 二进制文件。看看 Homebrew 二进制文件如何比较会很有趣。 (我猜他们会输。)

【讨论】:

    【解决方案2】:

    三件事:

    1. 这么小的差异通常并不显着:

      0m35.466s - 0m35.036s = 0m0.43s  or 1.2%
      
    2. 然而wc -l awk 'END{print NR}' 快(10 倍)。

      % time seq 100000000  | awk 'END{print NR}' > /dev/null
      
      real    0m13.624s
      user    0m14.656s
      sys 0m1.047s
      % time seq 100000000  | wc -l > /dev/null
      
      real    0m1.604s
      user    0m2.413s
      sys 0m0.623s
      
    3. 我的猜测是硬盘缓存保存了find 结果,所以在第一次使用wc -l 运行后,find 所需的大部分读取都在缓存中。据推测,初始find 与磁盘读取之间的时间差异与第二个find 与缓存读取之间的时间差异将大于awkwc 之间的运行时间差异。

      对此进行测试的一种方法是重新启动,这会清除硬盘缓存,然后再次运行这两个测试,但以相反的顺序,因此首先运行awk。我预计第一次运行awk 会比第一次运行wc 更慢,第二次运行wc 会比第二次运行awk 更快。

    【讨论】:

    • 几乎与awksed 一样慢。 time seq 100000000 | sed -n '$=' > /dev/null12s 进入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2020-05-10
    • 2017-07-26
    • 2015-10-22
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多