命名管道比bash中的普通管道更快?

时间:2016-11-10 08:47:32

标签: bash performance named-pipes

我目前正在编写一个bash脚本,其中我使用了很多命名管道。我认为与直接使用管道相比,这可能会产生一些开销,但我认为我没关系,我只是想得到一些统计数据来找出我处理的确切程度。 。因此,我每次运行这两个命令50次,记下时间平均值:

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的速度有多快...

1 个答案:

答案 0 :(得分:1)

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