如果我从 bash 脚本(相对于命令行)执行命令,会有什么不同吗(例如,性能方面)?

如果我从 bash 脚本(相对于命令行)执行命令,会有什么不同吗(例如,性能方面)?

以下之间有什么区别(例如性能方面):

$ make && cp bin/myexecutable inputfile.txt $workdir && cd $workdir
$ <series of sed commands to modify inputfile.txt>
$ mpirun -n 12 ./myexecutable [args]

与通过脚本执行此操作相比:

myscript.sh:

#!/bin/bash
make && cp bin/myexecutable inputfile.txt $workdir && cd $workdir
<series of sed commands to modify inputfile.txt>
mpirun -n 12 ./myexecutable [args]

+

$ ./myscript.sh

询问的原因是我经常在工作站上运行多个(10-100 或更多)模拟作业。每个作业都将在不同的工作目录中运行(并且具有不同的输入文件和不同的参数集)——因此编写运行脚本将使在大量参数上运行许多测试变得更加容易。一些模拟运行可能会持续几天。

性能差异是否可以忽略不计(即 < 5-10%)?脚本(相对于命令行)是否会看到不同的环境并因此导致出现问题?

答案1

mpirun从命令行或脚本执行mpirun根本不会改变命令的性能。唯一的性能差异是启动时间:启动时运行脚本需要几毫秒(如果 shell 可执行文件不在磁盘缓存中,则需要更多毫秒),而在命令行上键入需要花费多少秒才能键入所有内容。

您可以通过告诉 shell 用它正在运行的最后一个命令替换自身来节省少量内存,而不是等待最后一个命令完成并立即终止。替换mpirun …exec mpirun ….

使用 dash 代替 bash 可以节省少量的启动时间。对于像 mpirun 这样的长时间运行的作业来说,差异完全可以忽略不计;性能优势仅在启动大量小型 shell 脚本的任务中可见,例如启动 Linux。

将命令放入脚本中有一个主要优点:您可以设置一系列命令,如果您想对这些命令进行一些调整,只需编辑该文件即可。

答案2

性能差异可以忽略不计。在任何一种情况下,代码本身都不会运行得更慢或更快,并且启动它几乎没有什么区别,因为 bash 二进制文件的代码很可能已经在内存中了。

答案3

您真的考虑手动启动这么多命令吗? ——这肯定是非常无能的。 (也许您想在问题中更好地解释这一点。)

从 shell 调用脚本恰好需要一个额外的 shell 进程;这根本不是问题,特别是如果您的脚本中有那么多命令。但是将命令放在一起可以使处理和扩展变得更容易。

根据您拥有的命令以及调用它们的方式,如果单独调用这些命令,您也可能会影响您的调用 shell 环境;例如,如果采购任何基于 shell 脚本的命令。将所有命令放在一个脚本中可以将更改保留在本地。

简而言之:有很多理由将所有命令放入脚本中。

答案4

正如其他人所说,会有差异但可以忽略不计。以下是检查方法

macair:scripts $ time ps
  PID TTY           TIME CMD
  437 ttys000    0:00.01 -bash
  442 ttys001    0:00.43 -bash

real    0m0.009s
user    0m0.002s
sys     0m0.007s

macair:scripts $ time ./ps.sh 
  PID TTY           TIME CMD
  437 ttys000    0:00.01 -bash
  442 ttys001    0:00.44 -bash
32559 ttys001    0:00.00 /bin/bash ./ps.sh

real    0m0.012s
user    0m0.004s
sys     0m0.008s
macair:scripts $ cat ps.sh 
#!/bin/bash

ps
macair:scripts $ echo $SHELL
/bin/bash

但性能实际上取决于自动和手动一一输入命令。

相关内容