有没有关于 bash 和 dash 速度的具体数据?

有没有关于 bash 和 dash 速度的具体数据?

根据这篇文章,dash之所以选择它是/bin/sh因为bash其速度较慢:破折号作为 /bin/sh

有没有具体的数字来表明到底快多少dash

bash如果使用而不是dash来启动 Ubuntu,需要多长时间?

上述链接的论点今天仍然有效吗?背景:system-v init 使用了很多 shell 脚本,但 systemd 没有。

这个问题与综合基准测试中的速度无关。它与最终用户的整体显著优势有关。关于 dash 与 bash 速度的综合基准测试无法回答这个问题。

答案1

这个测试并不代表启动过程,但你可以通过制作一个小测试脚本来简单地尝试一下,我称之为shspeed

$ cat shspeed
for a in `seq 10000`; do ( :; ); done

这只是一个接一个地分叉 10000 个子 shell。现在用 bash 和 dash 运行它并计时:

$ time dash shspeed
dash shspeed  0,70s user 0,33s system 107% cpu 0,965 total

$ time bash shspeed
bash shspeed  1,59s user 0,76s system 108% cpu 2,180 total

因此,在我的硬件(大约 1 年前的 Dell XPS 13 9365)上,它的速度要快得多。您可以想象,在低端硬件上,它会产生更大的差异。此外,此测试仅涉及 for 循环和生成子 shell。对于某些测试,结果可能更为显著。

当然,你可以忽略这一点,说你不关心生成 10000 个子炮弹的速度有多快。好吧,有些人似乎很关心 :)

对于您的特定启动过程,可能不会产生任何明显差异。如果您使用并用秒表测量差异,我认为没有/bin/bash问题/bin/sh

请查看@wjandrea 的这些链接,了解此事的详细解释:https://wiki.ubuntu.com/DashAsBinShsh 链接到 dash 有什么意义?

systemd 时代的 Shell 速度

在您修改问题之后,听起来您似乎不太关心哪个 shell 更快,而是更关心为什么我们仍然坚持使启动过程快半秒(左右),尤其是现在我们不再像 sysv-init 为标准时那样使用 shell 脚本。

由于我没有参与 Ubuntu 的政治,因此我将尝试给出我认为的答案:

  1. 如果您可以仅通过指向另一个 shell 的符号链接就使某件事快半秒,那么这是值得的。

  2. 让默认 shell 只执行 POSIX 要求默认 shell 执行的操作,这样才能保证可移植性。想象一下,一个发行版在 init 脚本中使用了另一个发行版尚未具备的 bash 功能。

  3. 还添加了 (d)ash,以便能够修复标准脚本中的 bashism,并避免将来出现此类问题。/bin/sh这是公认的标准,大型基础设施都依赖于此。我并不想用具有更大代码库和不需要的功能的东西来替换它。

  4. 使用更少的 CPU 周期和内存总是值得的。即使是 systemd 单元也经常在后台运行 shell 脚本。

对于普通用户来说,这些可能都无关紧要,但他们间接得到的是整体更稳定的分布。

为什么不抨击?

这更像是一种观点:就我个人而言,我永远不会选择在 dash 中编写脚本。它只提供非常基本的构造。对于较大的软件,我宁愿选择 bash 或 zsh(或者根本不是 shell 的东西)。我可能想要使用哪些功能:高级参数扩展、shell 算法、数组,也许还有更多。

这不应该发生在主要用于启动守护进程或安装软件的脚本中。这些脚本应该使用最少的指令集,并保持脚本的可读性和简单性。但如果 bash 的所有优点都可以使用,这种情况很可能会发生。

/bin/sh应该主要用于在合理方便的环境中运行外部程序,而不是用于复杂的软件系统。

概括

/bin/sh由 dash 实现的 带来了一种兼容 POSIX 的快速且稳定的脚本语言,可作为系统 shell 脚本的标准和默认解释器。这些特性绝不会为了方便功能而牺牲。

从程序员的角度来看,它实现了“只做一件事,并把它做好”的口头禅。

这主要不是一种优化,而是一种职责分离。

它已经存在了,因此无需付出额外的努力去保留它。

站在最终用户的立场上看,就会出现这样的问题:什么样的最终用户?桌面用户可能不在乎,但他们仍会从更稳定(也许速度稍快一点)的发行版中受益。软件包维护者会非常在意,他们受益于一个可靠的系统解释器,该解释器具有一组经过良好定义和测试的功能。程序员不应该在意,因为他们可能不会在/bin/sh.

PS:bash 二进制文件的大小几乎是 dash 二进制文件的 10 倍!

相关内容