【发布时间】: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中,wc和awk之间的差异或多或少地消失在噪音中。