Shell循环慢,而bash循环最慢。Shell并不是要循环执行繁重的工作。Shell旨在对批量数据启动一些外部的,优化的过程。
无论如何,我很好奇壳循环如何比较,所以我做了一个基准测试:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
详细信息:
- CPU:Intel(R)Core(TM)i5 CPU M 430 @ 2.27GHz
- ksh:sh版本(AT&T Research)93u + 2012-08-01
- bash:GNU bash,版本4.3.11(1)-发行版(x86_64-pc-linux-gnu)
- zsh:zsh 5.2(x86_64-unknown-linux-gnu)
- 破折号:0.5.7-4ubuntu1
)
(缩写的)结果(每次迭代的时间)为:
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
从结果:
如果您想要一个稍微快一点的Shell循环,那么如果您拥有[[
语法并且想要一个快速的Shell循环,那么您就在高级Shell中,并且您也拥有类似于C的for循环。然后使用C like for循环。while [
在同一shell中,它们的速度大约是-loop的2倍。
- ksh具有最快的
for (
循环,每次迭代约2.7µs
- 破折号具有最快的
while [
循环,每次迭代约5.8µs
C for循环可以快3-4个十进制数量级。(我听说Torvalds爱C)。
优化的C for循环比bash while [
循环(最慢的Shell循环)快56500倍,比ksh for (
循环(最快的Shell循环)快6750倍。
再说一次,shell的缓慢性无关紧要,因为使用shell的典型模式是将一些优化的外部程序卸载。
使用这种模式,shell通常使编写脚本的性能要比python脚本好得多(我上次检查时,在python中创建进程管道相当笨拙)。
要考虑的另一件事是启动时间。
time python3 -c ' '
我的PC需要30到40毫秒,而外壳需要3毫秒。如果您启动了许多脚本,这很快就会加起来,并且您可以在python启动额外的27-37毫秒内完成很多工作。小脚本可以在该时间范围内完成多次。
(NodeJs可能是该部门中最糟糕的脚本运行时,因为它仅需100毫秒即可启动(即使启动后,您仍很难在脚本语言中找到性能更好的执行器))。