linux - wc -l 的性能

标签 linux bash awk time wc

我运行了以下命令:

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,而不是 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 二进制文件如何比较会很有趣。 (我猜他们会输。)

关于linux - wc -l 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43379170/

相关文章:

linux - 覆盖/boot/grub/menu.lst?

bash - dwm xsetroot CPU使用率显示与awk

bash - 在 bash 中使用参数文本文件

linux - 在第一个匹配项之前插入行的命令

linux - 如何查找特定模式并打印该模式上方和下方的所有内容,直到到达指示器 (LINUX)?

用于在 overpass-API 端点上运行请求的 Python 包装器

linux - 使用 printf 打印 ascii 字符,但 printf 不会打印八进制 100+ 的任何内容

linux - awk从列中找到最大值和最小值并存储在其他列中

linux - 杀死正在使用端口的 PID

linux - Bash sizeout 脚本