我运行了以下命令:
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
,而不是 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
,而是在一个大文本文件(66k 行)上使用了 wc -l
或 `awk 'END{print NR}'一个循环。
我改变了命令的顺序,但没有发现任何大到足以改变我报告的排名的偏差。
LC_CTYPE=C
对这些都没有可测量的影响。
结论
除非数据量很小,否则不要使用 mac 内置命令行工具。
GNU wc 在计算行数方面比 GNU awk 更快。
我使用 MacPorts GNU 二进制文件。看看 Homebrew 二进制文件如何比较会很有趣。 (我猜他们会输。)
关于linux - wc -l 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43379170/