bash - bash 函数调用到底有多贵?

标签 bash

如果有兴趣,是否有关于 Bash 中的函数调用到底有多昂贵的任何来源?我希望它们比直接执行其中的代码慢几倍,但我似乎找不到任何相关信息。

最佳答案

我真的不同意在 bash 中编程时性能不应该是一个问题。这实际上是一个非常好的问题。

这是一个可能的基准测试,比较内置的 true 和命令 true,其完整路径是 /bin/true 在我的机器。

在我的机器上:

$ time for i in {0..1000}; do true; done

real    0m0.004s
user    0m0.004s
sys 0m0.000s
$ time for i in {0..1000}; do /bin/true; done

real    0m2.660s
user    0m2.880s
sys 0m2.344s

太棒了!仅通过 fork 一个进程(在我的机器上)就浪费了大约 2 到 3 毫秒!

所以下次你有一些大文本文件要处理时,你将避免错误的长链管道 cats、greps、awks, cuts, trs, seds, heads, tails,you-name-its。此外,UNIX 管道也非常慢(这是您的下一个问题吗?)。

假设您有一个 1000 行的文件,并且在每一行中放置一个 cat 然后一个 grep 然后一个 sed 然后一个 awk(不,别笑,你可以通过浏览本网站上的帖子看到更糟的情况!),那么你已经在浪费(在我的机器上)至少 241000=8000ms=8s 只是 fork 愚蠢和无用的进程。

回答您关于管道的评论...

###子壳

子壳非常慢:

$ time for i in {1..1000}; do (true); done

real    0m2.465s
user    0m2.812s
sys 0m2.140s

太棒了!每个子外壳超过 2 毫秒(在我的机器上)。

###管道

管道也很慢(考虑到它们涉及子 shell,这应该是显而易见的):

$ time for i in {1..1000}; do true | true; done

real    0m4.769s
user    0m5.652s
sys 0m4.240s

太棒了!每个管道超过 4 毫秒(在我的机器上),因此在减去子 shell 的时间后,管道只需要 2 毫秒。

重定向

$ time for i in {1..1000}; do true > file; done

real    0m0.014s
user    0m0.008s
sys 0m0.008s

所以这非常快。

好的,您可能还希望看到它在创建文件时的实际效果:

$ rm file*; time for i in {1..1000}; do true > file$i; done

real    0m0.030s
user    0m0.008s
sys 0m0.016s

仍然相当快。

管道与重定向:

在您的评论中,您提到:

sed '' filein > filetmp; sed '' filetmp > fileout

对比

sed '' filein | sed '' > fileout

(当然,最好的办法是使用单个 sed 实例(这通常是可能的),但这并不能回答问题。)

让我们检查一下:

一个有趣的方式:

$ rm file*
$ > file
$ time for i in {1..1000}; do sed '' file | sed '' > file$i; done

real    0m5.842s
user    0m4.752s
sys 0m5.388s
$ rm file*
$ > file
$ time for i in {1..1000}; do sed '' file > filetmp$i; sed '' filetmp$i > file$i; done

real    0m6.723s
user    0m4.812s
sys 0m5.800s

所以使用管道似乎比使用临时文件(对于 sed)更快。事实上,这可以在不输入行的情况下理解:在管道中,一旦第一个 sed 吐出一些东西,第二个 sed 就开始处理数据。在第二种情况下,第一个 sed 完成它的工作,然后第二个 sed 完成它的工作。

所以我们的实验并不是确定管道是否比重定向更好的好方法。

进程替换怎么样?

$ rm file*
$ > file
$ time for i in {1..1000}; do sed '' > file$i < <(sed '' file); done

real    0m7.899s
user    0m1.572s
sys 0m3.712s

哇,真慢!嘿,但是观察用户和系统 CPU 使用率:比其他两种可能性要少得多(如果有人能解释一下......)

关于bash - bash 函数调用到底有多贵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801795/

相关文章:

linux - 如何将字符串输入重定向到 sudo?

node.js - 如何使用 TypeScript 制作 shell 可执行 Node 文件

bash - sed 从 Fish 到 bash

linux - Grep 以特定字符开头的所有字符串实例

linux - 我如何告诉 bash 脚本从头开始?

Bash:在字符串中查找数字并将其相加

bash - 终端 - 对整个目录运行 'file' (文件类型)

bash - 这个文件重命名循环有什么问题?

linux - 如何在 xfs 中获取文件创建日期/时间

git - 警告 : ignoring broken ref refs/remotes/origin/HEAD