bash函数调用真的有多贵?

hel*_*hod 6 bash

如果感兴趣的话,是否有任何关于Bash中功能调用有多贵的来源?我希望它们比直接在其中执行代码慢几倍,但我似乎无法找到任何关于此的东西.

gni*_*urf 9

我真的不同意在使用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
Run Code Online (Sandbox Code Playgroud)

惊人!只需要一个进程(在我的机器上)就浪费了大约2到3毫秒!

所以下次你要处理一些大的文本文件时,你会避免管道cats,greps,awks,cuts,trs,seds,heads,tails 的(延迟的)长链you-name-it.此外,unix管道也非常慢(这将是你的下一个问题?).

想象一下,你有1000行的文件,如果在每一行你把一个cat接着一个grep接着一个sed,然后一awk(没有,别笑,你可以通过帖子上这个网站去看看更糟!),那么你"已经浪费(在我的机器上)至少2*4*1000 = 8000ms = 8s只是分叉愚蠢和无用的过程.

更新.回答你对管道的评论......

子shell

子壳很慢:

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

real    0m2.465s
user    0m2.812s
sys 0m2.140s
Run Code Online (Sandbox Code Playgroud)

惊人!每个子壳超过2ms(在我的机器上).

管道

管道也很慢(这应该是明显的,因为它们涉及子壳):

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

real    0m4.769s
user    0m5.652s
sys 0m4.240s
Run Code Online (Sandbox Code Playgroud)

惊人!每个管道超过4ms(在我的机器上),所以管道只需2ms(减去子壳的时间).

重定向

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

real    0m0.014s
user    0m0.008s
sys 0m0.008s
Run Code Online (Sandbox Code Playgroud)

所以这很快.

好吧,您可能还希望通过创建文件来查看它:

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

real    0m0.030s
user    0m0.008s
sys 0m0.016s
Run Code Online (Sandbox Code Playgroud)

仍然体面快速.

管道与重定向:

在你的评论中,你提到:

sed '' filein > filetmp; sed '' filetmp > fileout
Run Code Online (Sandbox Code Playgroud)

VS

sed '' filein | sed '' > fileout
Run Code Online (Sandbox Code Playgroud)

(当然,最好的方法是使用单个实例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
Run Code Online (Sandbox Code Playgroud)

因此,使用管道而不是使用临时文件(对于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
Run Code Online (Sandbox Code Playgroud)

哇,那很慢!嘿,但观察用户和系统CPU使用情况:远远少于其他两种可能性(如果有人可以解释那......)

  • 尽管它没有回答我的问题(我询问了功能的成本,而不是分叉了新流程),但我接受这个答案,因为它非常详细且高质量(我实际上学到了很多东西)。 (2认同)