出于好奇,我做的Bash和C之间的即席基准:为什么b比b快?
#!/bin/sh
for i in `seq 1 10000`; do
true
done
在我的机器,这种运行0.02秒。非常快。我的理解是Bash解析命令并运行fork/exec。因此,我希望以下的版本,在C,要快得多,因为它不需要做任何分析:
#include <unistd.h>
int main() {
char *const argv[] = { "/bin/true", NULL };
for (int i = 0; i < 10000; i++) {
pid_t pid = fork();
if (pid == 0) // child
execv(argv[0], argv);
int status = 0;
waitpid(pid, &status, 0);
}
return 0;
}
令我惊讶的是,这花了约8秒!我认为Bash可能会做一些聪明的优化,如果它有真知灼见的话,那么真的只是一个无用的东西,根本不值得打电话。所以我尝试了echo -n的相同实验,睡眠时间为0.0001,得到了相似的结果。这些命令肯定会被调用,但是Bash没有C的fork/exec开销。为什么Bash在这种情况下要快得多?
当循环中没有命令时,为什么会使用bash fork? – luk32
你的C版本产卵10000个进程,bash的版本派生的,即使你的实验没有 –
是有效的(这不是),叉/ EXEC的性能下降到操作系统不是C语言。我怀疑启动一个新进程时,bash和你的C代码之间会有什么显着差异。 – Clifford