我们将在上面的globing示例中进行扩展,以说明Shell脚本解释器的一些性能特征。比较本例bash
和dash
解释器(其中为30,000个文件中的每一个生成一个进程),该破折号可以以wc
几乎两倍于该进程的速度生成进程。bash
bash-4.2$ time dash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real 0m1.238s
user 0m0.309s
sys 0m0.815s
bash-4.2$ time bash -c 'for i in *; do wc -l "$i"; done>/dev/null'
real 0m1.422s
user 0m0.349s
sys 0m0.940s
通过不调用wc
进程来比较基本循环速度,表明dash的循环快了将近6倍!
$ time bash -c 'for i in *; do echo "$i">/dev/null; done'
real 0m1.715s
user 0m1.459s
sys 0m0.252s
$ time dash -c 'for i in *; do echo "$i">/dev/null; done'
real 0m0.375s
user 0m0.169s
sys 0m0.203s
如前所述,在任何一个shell中循环仍然相对较慢,因此,为了实现可伸缩性,我们应尝试使用更多的功能技术,以便在编译过程中执行迭代。
$ time find -type f -print0 | wc -l --files0-from=- | tail -n1
30000 total
real 0m0.299s
user 0m0.072s
sys 0m0.221s
上面是迄今为止最有效的解决方案,它很好地说明了一个问题,即应该在shell脚本中做尽可能少的事情,并且旨在仅使用它来连接UNIX系统上丰富的实用程序集中的现有逻辑。
PádraigBrady从常见的shell脚本错误中偷走了。