Contents

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 的相对性能。因此,更高的每秒执行次数意味着更好的性能

此外,该实用程序提供了八个示例基准测试 来检查不同操作的性能。实际上,我们可以同时在shbashkshzshdash等几个 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 本身附带的示例脚本。

此外,我们可以看到结果的图形表示: /uploads/dash_vs_bash_performance/1.png

条形图显示了与 Bash 相比,Dash 在变量赋值、逻辑比较、计数操作、表达式评估、函数调用、显示操作和子 shell 操作等多种操作上的更好性能。在执行速度方面,Dash shell 的效率大约是 Bash shell 的 2-5 倍。