3

$| = 1;私は最近、Perlスクリプト内で設定して、パイプを介して別のアプリケーションとより高速に通信できるようにする特権を持っていました。

なぜこれがデフォルト設定ではないのか知りたいです。言い換えると、バッファがすぐにフラッシュされた場合、何を失うのでしょうか?

4

3 に答える 3

13

ファイル記述子への書き込みはシステムコールを介して行われ、システムコールは低速です。

ストリームをバッファリングし、ある程度のデータが書き込まれた後でのみフラッシュすることは、一部のシステムコールを節約する方法です。

于 2011-09-13T16:15:15.157 に答える
8

それをベンチマークすれば、あなたは理解するでしょう。

バッファリングは、出力ハンドルのデバイスタイプによって異なります。ttyはラインバッファリングされます。パイプとソケットはパイプバッファリングされています。ディスクはブロックバッファリングされます。

これは単なる基本的なプログラミングです。それはPerlのものではありません。

于 2011-09-13T16:17:46.390 に答える
3

I / Oバッファがフラッシュされる回数が少ないほど、コードは一般的に高速になります(システムコールを頻繁に行う必要がないため)。そのため、自動フラッシュを有効にすることで、コードはI/Oの待機により多くの時間を費やします。

純粋なネットワークI/O駆動型アプリケーションでは、それは明らかにより理にかなっています。ただし、最も一般的な使用例では、ラインバッファI / O(PerlのTTYのデフォルト)により、プログラムはバッファをフラッシュする頻度を減らし、CPU作業により多くの時間を費やすことができます。平均的なユーザーは、端末やファイルの違いに気付かないでしょう。

于 2011-09-13T16:17:05.930 に答える