2014-12-22 89 views
2

出於好奇,我做的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在這種情況下要快得多?

+2

當循環中沒有命令時,爲什麼會使用bash fork? – luk32

+5

你的C版本產卵10000個進程,bash的版本派生的,即使你的實驗沒有 –

+0

是有效的(這不是),叉/ EXEC的性能下降到操作系統不是C語言。我懷疑啓動一個新進程時,bash和你的C代碼之間會有什麼顯着差異。 – Clifford

回答

11

trueecho都是Bash內置命令,所以它不需要派生一個外部進程來運行它們,使其更快。

$ type true 
true is a shell builtin 
$ type echo 
echo is a shell builtin 
+1

的確,用'/ bin/true'替換'true'會將我的系統中的時間從0.085s改爲10.692s。 – tripleee

相關問題