c - 为什么 bash 比 C 快?

标签 c bash shell

<分区>

出于好奇,我在 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 在这种情况下要快得多?

最佳答案

trueecho 都是 Bash 内置命令,因此它不需要生成外部进程来运行它们,从而使其速度更快。

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

关于c - 为什么 bash 比 C 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27599516/

相关文章:

c - 冒泡排序算法实现(Haskell vs. C)

c - 如何将int转换为char类型并用它来停止循环?

c - 如何在linux上编译运行在windows上的c程序

linux - 在 shell 脚本中具有 $ 值的变量

bash - 以编程方式将参数提供给 sed

c - 如何以线程安全的方式使用 libuv 异步句柄?

perl - 你如何爬上 bash 脚本的父目录结构?

Bash 中的 MySQL 错误

bash - "read"指令在没有参数的情况下如何工作?

linux - 给定行分隔的文本 block ,如何返回包含特定关键字的每个 block ?