私はティーがパイプラインを遅くするかどうか疑問に思っています。結局のところ、ディスクへのデータの書き込みは、データをパイプするよりも遅くなります。
Tは、データがディスクに書き込まれるまで、次のパイプにデータを送信して待機しますか?(そうでない場合は、送信されたがディスクに書き込まれていないデータをTがキューに入れなければならないので、私には思えないでしょう。)
$ program1 input.txt | tee intermediate-file.txt | program2 ...
私はティーがパイプラインを遅くするかどうか疑問に思っています。結局のところ、ディスクへのデータの書き込みは、データをパイプするよりも遅くなります。
Tは、データがディスクに書き込まれるまで、次のパイプにデータを送信して待機しますか?(そうでない場合は、送信されたがディスクに書き込まれていないデータをTがキューに入れなければならないので、私には思えないでしょう。)
$ program1 input.txt | tee intermediate-file.txt | program2 ...
回答:
はい、それは物事を遅くします。そして、基本的には書き込まれていないデータのキューがありますが、それは実際にはカーネルによって維持されます。明示的に別の方法で要求しない限り、すべてのプログラムにキューがあります。
たとえば、ここにを使用した簡単なパイプがありpv
ます。これは転送レートを表示するので便利です。
$ pv -s 50g -S -pteba /dev/zero | cat > /dev/null
50GiB 0:00:09 [ 5.4GiB/s] [===============================================>] 100%
さて、tee
そこにを追加しましょう。追加のコピーを書くことすらしません。転送するだけです。
$ pv -s 50g -S -pteba /dev/zero | tee | cat > /dev/null
50GiB 0:00:20 [2.44GiB/s] [===============================================>] 100%
だから、それはかなり遅く、何もしていませんでした!これは、内部でSTDINをSTDOUTにコピーするTのオーバーヘッドです。(興味深いことに、pv
そこに1秒を追加すると5.19GiB / sに留まるためpv
、tee
。をpv
使用するよりもかなり高速ですがsplice(2)
、tee
そうではない可能性があります。)
とにかく、tee
ディスク上のファイルに書き込むように指示するとどうなるか見てみましょう。最初はかなり高速(約800MiB / s)ですが、その後も速度は低下し続け、最終的には約100MiB / sまで低下します。これは基本的にディスク書き込み帯域幅の100%です。(高速起動は、カーネルがディスク書き込みをキャッシュしているためであり、ディスク書き込み速度の低下は、カーネルがキャッシュを無限に大きくすることを拒否しているためです。)
上記は最悪の場合です。上記は、パイプを使用してデータを可能な限り高速に生成します。このように考えることができる唯一の実際の使用法は、生のYUVデータをに/からパイプすることffmpeg
です。
低速でデータを送信している場合(それらを処理しているためなど)、それほど大きな影響はありません。
結局ここで驚くべきことは何もない
> POSIXは言う、
説明
ティーユーティリティは、ゼロ以上のファイルにコピーを作成し、標準出力に標準入力をコピーするものとします。ティーユーティリティが出力をバッファリングしてはなりません。
そしてそれも
根拠
バッファリング要件は、ティーがISO C標準の完全にバッファリングされた、またはラインバッファリングされた書き込みの使用を許可されていないことを意味します。これは、ティーが1バイトの読み取りに続いて1バイトの書き込みを行わなければならないという意味ではありません。
だから、「根拠」を説明せずに、tee
おそらく読み取り専用になり、最大書き込みが多く、一度にあなたのパイプ・バッファに収まることができるバイトごとに単一の書き込みに出力をフラッシュします。
そして、はい、アプリケーションによっては、これはかなり非効率的な場合があります。そのため、これらのいずれかを単に削除/コメントして
ください:https : //github.com/coreutils/coreutils/blob/master/src/tee.c#L208
https://github.com/coreutils/coreutils/blob/master/src/tee.c#L224
tee
実行が速くなりますか?