wc -l的性能

时间:2017-04-12 20:34:19

标签: linux bash awk time wc

我运行了以下命令:

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

得到了100行的结果:

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

然后我运行了以下命令:

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

得到了100行的结果:

真实0m35.036s 用户0m15.848s sys 0m14.056s

我确切地说我之前已经运行find / -name "*.service"因此它被缓存了两个命令。

我希望wc -l更快。为什么不呢?

2 个答案:

答案 0 :(得分:2)

其他人已经提到您可能会计时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,而是使用wc -l或'awk' END {print NR}'在循环中的大文本文件(66k行)上。

我改变了命令的顺序,并没有找到足够大的偏差来改变我报告的排名。

LC_CTYPE=C对其中任何一项都没有可衡量的影响。

结论

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

  2. GNU wc在计算行时比GNU awk快。

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

答案 1 :(得分:1)

三件事:

  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更快save {1}}。