如果有兴趣,是否有关于 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 毫秒!
所以下次你有一些大文本文件要处理时,你将避免错误的长链管道 cat
s、grep
s、awk
s, cut
s, tr
s, sed
s, head
s, tail
s,you-name-it
s。此外,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/