我真的不同意在使用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只是分叉愚蠢和无用的过程.
更新.回答你对管道的评论......
子壳很慢:
$ 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使用情况:远远少于其他两种可能性(如果有人可以解释那......)