使用子shell的开销是多少?

Lin*_*ner 8 linux performance bash fedora subshell

希望这个问题不是太笼统。我对 shell 脚本很陌生,我来自计算机体系结构/非脚本编程背景。我在我工作的脚本中注意到,很少通过围绕整个脚本创建子 shell 来编写脚本。在我正在编写的脚本中,当我可以用一个子 shell 包围它时,我就是这样,因为它可以防止它与调用我的其他脚本混淆(以防万一)。由于与此方法相关的一些开销,这不是一种常见做法吗?我很难在网上找到这个。

例子:

#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell
Run Code Online (Sandbox Code Playgroud)

PSk*_*cik 8

子外壳确实有开销。

在我的系统上,最小的 fork-exec 成本(当您在文件不冷的情况下从磁盘运行程序时)2ms约为1ms.

使用子shell,您只是在谈论分叉成本,因为不需要exec编辑文件。如果子外壳保持合理的低,1ms在面向人的程序中可以忽略不计。我相信人类不会注意到任何发生得更快的事情50ms(这就是现代脚本语言解释器往往需要多长时间才能开始(我pythonrvm这里说的是ruby )与最新的nodejs占用时间100ms)。

但是,它确实与循环相加,然后您可能想要替换例如相当常见的 bactick 或$()模式,return通过将函数打印到 stdout 以供父 shell 使用 bashisms printf -v(或使用快速外部程序来处理整个批次)。

所述的bash完成包经由使用在所描述的技术通过变量名返回具体避免这种亚壳成本http://fvue.nl/wiki/Bash:_Passing_variables_by_reference


比较

time for((i=0;i<10000;i++)); do echo "$(echo hello)"; done >/dev/null 
Run Code Online (Sandbox Code Playgroud)

time for((i=0;i<10000;i++)); do echo hello; done >/dev/null 
Run Code Online (Sandbox Code Playgroud)

应该可以很好地估计您的系统fork开销是多少。