<分区>
出于好奇,我在 Bash 和 C 之间做了一个临时基准测试:
#!/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 可能会做一些聪明的优化,如果它有洞察力 true 只是一个空操作,根本不值得调用。所以我用 echo -n 和 sleep 0.0001 尝试了同样的实验,得到了相似的结果。这些命令肯定会被调用,但 Bash 没有 C 所具有的 fork/exec 开销。为什么 Bash 在这种情况下要快得多?