我运行了以下命令:
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
更快。为什么不呢?
答案 0 :(得分:2)
其他人已经提到您可能会计时find
,而不是wc
或awk
。不过,wc
和awk
之间的各种风格可能会有一些有趣的差异。
以下是我得到的结果:
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
对其中任何一项都没有可衡量的影响。
结论
除了少量数据外,不要使用mac内置命令行工具。
GNU wc在计算行时比GNU awk快。
我使用MacPorts GNU二进制文件。看看Homebrew二进制文件如何比较会很有趣。 (我猜他们输了。)
答案 1 :(得分:1)
三件事:
这么小的差异通常不显着:
0m35.466s - 0m35.036s = 0m0.43s or 1.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
我的猜测是硬盘缓存保存find
结果,因此在第一次运行wc -l
后,find
所需的大部分读取都在缓存中。据推测,初始find
与磁盘读取和第二个find
与缓存读取之间的时间差异将大于awk
和wc
之间的运行时间差异。
测试此方法的一种方法是重新启动,清除硬盘缓存,然后再次运行两个测试,但按相反的顺序,以便首先运行awk
。我希望首次运行的awk
比首次运行的wc
更慢,而第二次运行的wc
会比第二次运行awk
更快save
{1}}。