在 bash 中命名管道比普通管道快?

Named pipe faster than normal pipe in bash?

我目前正在编写一个 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 秒
标准偏差:0.0157 秒

未命名管道:
平均:1.644 秒
标准偏差:0.0339 秒

我现在的问题是:

我猜,因为 sort 只有在它拥有所有输入后才能开始工作(对吗?),这是关于管道吐出 EOF 的速度...

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