一方向のプロセス間通信を効率化できるように、名前付きパイプがどのように機能するかを理解しようとしています。データを循環バッファーにコピーするため、オーバーヘッドが発生することが予想されますが、これはRAMに格納されていると考えられますが、ファイルに書き込むよりもパイプがはるかに高速であると予想しました(RAMはディスクよりも桁違いに高速であるため)。
代わりに、名前付きパイプ(または匿名パイプ)がファイルとほぼ同じ速度であることがわかりました。これは、Ubuntu Linuxを実行している通常のディスクドライブ(ソリッドステートではない)を備えた3 GHzデスクトップ上にあります。Pythonの簡単なテストプログラムを次に示します。
import sys
import time
import random
megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))
while True:
before = time.time()
sys.stdout.write(megabyte)
after = time.time()
sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))
まっすぐに配管/dev/null
:
python test.py > /dev/null
メガバイトごとに2.1マイクロ秒(定数)を生成します。
ファイルへのパイピング:
python test.py > /tmp/testout.txt
500マイクロ秒から930マイクロ秒の間でジャンプします(ファイルが大きくなるにつれて、より大きな値がより一般的になります。おそらくディスクスペースを探しているためです)。
次に、名前付きパイプ:
mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe
640マイクロ秒(一定)と名前のないパイプを生成します。
python test.py | cat > /dev/null
また、650マイクロ秒(一定)を生成します。
パイプの速度がファイルの速度に似ている理由を誰もが説明できます/dev/null
か?「RAMベースのバッファではなく、ファイルベースのバッファを介してパイプを実行する」というスイッチがどこかにある可能性がありますが、そのスイッチを変更できますか?それはカーネルオプションかシェル変数でしょうか?
別の解釈:500は単なるパイピングで、930は実際に書き込みを行っているため、ディスク出力が500〜930マイクロ秒の間でジャンプするとします。両方の場合の配管の500〜640は同等です。しかし、その解釈のもとでは、パイピングと実際のディスクへの書き込みとの間に2倍しかないのはなぜですか? RAMディスクについて語るWebサイトでは、RAMディスクはハードディスクよりも50〜200倍高速であると言われています。
/dev/null
どこにも書いている間、かなり安い実際にある-それはファイル、FIFO、パイプまたは何も-それは努力を扱う「ロット」を必要とはるかに高価です。