以下之间有什么区别(例如性能方面):
$ 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
但性能实际上取决于自动和手动一一输入命令。