2016-11-10 107 views
0

我目前正在写一个bash脚本,其中我使用了很多命名管道。我认为这可能会造成一些开销,与直接使用管道相比,但我认为我没有问题,我只想获得一些统计数据,以确定我正在处理的是多少。因此,我跑了这两个命令各50次,次写下来,然后平均:在bash中命名管道比普通管道更快吗?

time seq 1000000 | sort | head; 
time seq 1000000 | cat >a | cat a | sort | head; #a was created with mkfifo 

这不是实际的方式,我会使用命名管道

写下的时候,我用这个命令:

for i in `seq 50`; do { time seq 1000000 | sort | head; } 2>&1 | grep real | cut -c8-12 >> normal_pipe; done 

令我惊讶的是,我发现这些结果:

普通管:
平均:1.712秒
STDDEV:0.0157秒

未命名管道:
平均:1.644秒
STDDEV:0.0339秒

我的问题,现在:

  • 为什么命名管道快?
  • 我的基准测试设置是否有缺陷?
  • 或者只是由于其他进程在后台运行而产生差异?

我猜,因为sort只能开工一旦所有的输入(右?),这是关于管的速度有多快吐出来的是EOF ...

+0

'seq 100 |猫> a |猫a | sort'可以写为'seq 100> a&sort a'。 – choroba

+0

两个西格玛,没什么特别的。 – MSalters

回答

1

我跑了在我的机器上进行了几次相同的测试,结果显示两种管道之间的差异很小。我的预感是.068秒的差异,没什么特别的,只是由于后台任务,就像你说的。