2014-12-22 90 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

相关问题