我在具有2259个条目的目录上进行了尝试,并使用了time
命令。
time for f in *; do echo "$f"; done
(减去文件!)的输出为:
real 0m0.062s
user 0m0.036s
sys 0m0.012s
time find * -prune | while read f; do echo "$f"; done
(减去文件!)的输出为:
real 0m0.131s
user 0m0.056s
sys 0m0.060s
我多次运行每个命令,以消除高速缓存未命中。这表明,将其保留bash
(对于i in ...)要比使用find
和传递输出(至bash
)更快
为了完整起见,我从中删除了管道find
,因为在您的示例中,这完全是多余的。just的输出find * -prune
是:
real 0m0.053s
user 0m0.016s
sys 0m0.024s
另外,time echo *
(输出不是用换行符分隔的,a):
real 0m0.009s
user 0m0.008s
sys 0m0.000s
在这一点上,我怀疑原因echo *
是更快,因为它没有输出太多的换行符,因此输出没有滚动太多。让我们测试一下...
time find * -prune | while read f; do echo "$f"; done > /dev/null
产量:
real 0m0.109s
user 0m0.076s
sys 0m0.032s
而time find * -prune > /dev/null
产量:
real 0m0.027s
user 0m0.008s
sys 0m0.012s
和time for f in *; do echo "$f"; done > /dev/null
产量:
real 0m0.040s
user 0m0.036s
sys 0m0.004s
最后:time echo * > /dev/null
产量:
real 0m0.011s
user 0m0.012s
sys 0m0.000s
某些变化可以由随机因素解释,但似乎很清楚:
- 输出缓慢
- 管道成本有点高
for f in *; do ...
本身比慢find * -prune
,但对于上述涉及管道的结构,速度更快。
此外,顺便说一句,这两种方法似乎都可以使用空格来处理名称。
编辑:
find . -maxdepth 1 > /dev/null
vs.的时间find * -prune > /dev/null
:
time find . -maxdepth 1 > /dev/null
:
real 0m0.018s
user 0m0.008s
sys 0m0.008s
find * -prune > /dev/null
:
real 0m0.031s
user 0m0.020s
sys 0m0.008s
因此,附加结论:
find * -prune
慢于find . -maxdepth 1
-在前一种情况下,shell处理一个glob,然后为构建一个(大)命令行find
。注意:find . -prune
只返回.
。
更多测试 time find . -maxdepth 1 -exec echo {} \; >/dev/null
:
real 0m3.389s
user 0m0.040s
sys 0m0.412s
结论:
- 迄今为止最慢的方法。正如在建议使用此方法的答案的注释中所指出的那样,每个参数都产生一个shell。
find
不会打开找到的文件。我唯一看到的关于大量文件的问题是ARG_MAX。