IO :: Socket :: Unixがすでにそれを行っているので、それはまったく何もしません...
データをチャンクで送信するオーバーヘッドが少ないため、ファイルライブラリは、システムにすぐに送信するのではなく、データを蓄積してバッファに出力します。4KBまたは8KB(バージョンによって異なります)のデータが蓄積された場合にのみ、データが実際にシステムに送信されます。これは「バッファリング」と呼ばれます。
ハンドルのautoflushをtrueに設定すると、そのハンドルのバッファリングが無効になります。を呼び出すprint
と、データはシステムに送信されてからprint
返されます。
違いを見ます:
$ perl -e'
STDOUT->autoflush($ARGV[0]);
for (0..9) { print $_ x 1024; sleep 1; }
' 1
<whole bunch of 1s>
<one second later: whole bunch of 2s>
<one second later: whole bunch of 3s>
<one second later: whole bunch of 4s>
<one second later: whole bunch of 5s>
<one second later: whole bunch of 6s>
<one second later: whole bunch of 7s>
<one second later: whole bunch of 8s>
<one second later: whole bunch of 9s>
$ perl -e'
STDOUT->autoflush($ARGV[0]);
for (0..9) { print $_ x 1024; sleep 1; }
' 0
# Before Perl 5.14:
<four seconds later: whole bunch of 0s, 1s, 2s and 3s>
<four seconds later: whole bunch of 4s, 5s, 6s and 7s>
<two seconds later: whole bunch of 8s and 9s>
# Perl 5.14+
<eight seconds later: whole bunch of 0s, 1s, 2s, 3s, 4s, 5s, 6s and 7s>
<two seconds later: whole bunch of 8s and 9s>
autoflush
IO :: Socket :: *によってオンになります。これは、ほとんどの場合、ソケットに必要だからです。ソケットは、インタラクティブな通信によく使用されます。リクエスト、返信、リクエスト、返信など。リクエストがバッファにスタックされた場合にどうなるか想像してみてください。あなたは永遠に返信を待っているでしょう!