出於好奇,我做的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