$| = 1;
私は最近、Perlスクリプト内で設定して、パイプを介して別のアプリケーションとより高速に通信できるようにする特権を持っていました。
なぜこれがデフォルト設定ではないのか知りたいです。言い換えると、バッファがすぐにフラッシュされた場合、何を失うのでしょうか?
ファイル記述子への書き込みはシステムコールを介して行われ、システムコールは低速です。
ストリームをバッファリングし、ある程度のデータが書き込まれた後でのみフラッシュすることは、一部のシステムコールを節約する方法です。
それをベンチマークすれば、あなたは理解するでしょう。
バッファリングは、出力ハンドルのデバイスタイプによって異なります。ttyはラインバッファリングされます。パイプとソケットはパイプバッファリングされています。ディスクはブロックバッファリングされます。
これは単なる基本的なプログラミングです。それはPerlのものではありません。
I / Oバッファがフラッシュされる回数が少ないほど、コードは一般的に高速になります(システムコールを頻繁に行う必要がないため)。そのため、自動フラッシュを有効にすることで、コードはI/Oの待機により多くの時間を費やします。
純粋なネットワークI/O駆動型アプリケーションでは、それは明らかにより理にかなっています。ただし、最も一般的な使用例では、ラインバッファI / O(PerlのTTYのデフォルト)により、プログラムはバッファをフラッシュする頻度を減らし、CPU作業により多くの時間を費やすことができます。平均的なユーザーは、端末やファイルの違いに気付かないでしょう。