Linux Shell性能: dash与bash
1. 概述
什么是shell ?在任何 Linux 系统中,shell 都是通过执行相关命令并将输出显示给用户来处理用户输入的接口。简单来说,shell 是通过命令行界面执行任务的环境。Linux 中的 shell 主要有两种类型:Bourne shell 和 C shell。Bourne shell 有许多子类别:
- POSIX 外壳 ( sh )
- 伯恩壳 ( sh )
- Korn 壳 ( ksh )
- Bourne Again shell ( bash )
- Z 外壳 ( zsh )
- Debian Almquist 外壳(破折号 )
在本文中,让我们深入研究两个特定的 shell:Bash 和 Dash。
2. Dash 和 Bash 的主要区别
长期以来,Bash 一直是大多数 Linux 发行版中默认的标准交互式 shell。然而,从 Ubuntu 6.10 开始,Dash 取代了 Bash。效率是更改默认 shell 的主要原因。
Bash 是一个用于交互使用的全功能 shell,并且仍然是默认的登录 shell。但是,它的启动和使用更大且更慢。另一方面,Dash shell 是 Bourne shell 的一个简单的现代 POSIX 兼容版本。Dash 有几个特点优势:
- 占用最少的磁盘空间,但功能丰富
- 对共享库的依赖低
- 启动时间相对较短
- 更好的执行速度
尽管 Bash shell 更通用、更广泛,并且更适合用户交互会话,但 Dash 的上述功能在速度方面超过了 Bash。在以下部分中,让我们比较两种 shell 的性能。
3. 启动时间基准测试
简单的基准测试包括为固定迭代执行一组命令并计算整个过程的时间消耗。两个感兴趣的外壳都将进行相同的测试,时间消耗测量它们的相对性能。
启动时间基准是使用“no-operation” (no-op, : ) 命令进行的简单测试。我们在每次迭代中启动 shell,并且不执行任何操作。消耗的总时间将指示每个 shell 的启动时间,因为没有执行额外的操作。
首先,让我们看看 Bash 的启动时间测试:
$ cat bash_benchmark_script
#!/bin/bash
for i in $(seq 1 1000);
do bash -c ":" ;
done
$ time bash bash_benchmark_script
real 0m1.486s
user 0m1.152s
sys 0m0.327s
在这里,我们使用了time 实用程序来找出执行给定脚本所花费的时间。bash_benchmark_script尝试调用 Bash shell 以运行1000次迭代的无操作。这意味着启动 Bash shell 1000次需要1.48 秒。
其次,我们来看看 Dash 的启动时间测试:
$ cat dash_benchmark_script
#!/bin/dash
for i in $(seq 1 1000);
do dash -c ":" ;
done
$ time dash dash_benchmark_script
real 0m0.999s
user 0m0.819s
sys 0m0.134s
dash_benchmark_script尝试调用 Dash shell 以执行1000次迭代的无操作。这意味着启动 Dash shell 1000次只需0.9 秒。
简而言之,我们看到 Dash shell 的启动时间比 Bash shell 的启动时间少了大约三分之一。这种效率是由于与 Bash 相比,对共享库的依赖较低以及 Dash 的总大小较小。
既然我们比较了启动时间,让我们在下一节中深入研究实时计算性能比较。
4. Shellbench 测试
Shellbench 是 POSIX shell 比较的基准实用程序。shellbench实用程序在无限循环中运行任何给定的命令集大约一秒钟*。*然后,它返回每秒的执行次数,用于计算脚本 shell 的相对性能。因此,更高的每秒执行次数意味着更好的性能。
此外,该实用程序提供了八个示例基准测试 来检查不同操作的性能。实际上,我们可以同时在sh、bash、ksh、zsh和dash等几个 shell 上运行测试来比较性能。
现在,让我们使用shellbench实用程序来比较 Bash 和 Dash 之间的性能:
## $ ./shellbench -s bash,dash sample/*
## name bash dash
assign.sh: positional params 354,961 1,552,364
assign.sh: variable 486,657 1,826,733
assign.sh: local var 505,224 1,888,458
cmp.sh: [ ] 254,506 903,775
cmp.sh: case 487,977 1,984,710
count.sh: posix 394,556 1,219,866
eval.sh: direct assign 265,855 1,219,592
eval.sh: eval assign 127,999 780,953
eval.sh: command subs 2,171 4,932
func.sh: no func 471,705 1,964,937
func.sh: func 273,133 1,563,748
null.sh: assign variable 545,798 1,858,063
null.sh: define function 591,780 2,189,993
null.sh: undefined variable 440,758 1,943,129
null.sh: : command 501,115 1,946,933
output.sh: echo 331,422 1,020,727
output.sh: printf 318,519 999,600
subshell.sh: no subshell 488,495 1,966,461
subshell.sh: brace 454,453 1,920,703
subshell.sh: subshell 2,586 5,206
subshell.sh: command subs 2,234 4,963
## subshell.sh: external command 1,037 1,083
* count: number of executions per second
请注意,我们通过*-s*开关指定了感兴趣的 shell ( bash,dash ) 。shellbench的主要参数 包括运行基准测试的脚本。在这里,我们使用了 Shellbench 本身附带的示例脚本。
此外,我们可以看到结果的图形表示:
条形图显示了与 Bash 相比,Dash 在变量赋值、逻辑比较、计数操作、表达式评估、函数调用、显示操作和子 shell 操作等多种操作上的更好性能。在执行速度方面,Dash shell 的效率大约是 Bash shell 的 2-5 倍。