开发者

Why aren't buffers auto-flushed by default?

I recently had the privilege of开发者_StackOverflow setting $| = 1; inside my Perl script to help it talk faster with another application across a pipe.

I'm curious as to why this is not the default setting. In other words, what do I lose out on if my buffer gets flushed straightaway?


Writing to a file descriptor is done via system calls, and system calls are slow.

Buffering a stream and flushing it only once some amount of data has been written is a way to save some system calls.


Benchmark it and you will understand.

Buffered depends on the device type of the output handle: ttys are line-buffered; pipes and sockets are pipe-buffered; disks are block-buffered.

This is just basic programming. It’s not a Perl thing.


The fewer times the I/O buffer is flushed, the faster your code is in general (since it doesn't have to make a system call as often). So your code spends more time waiting for I/O by enabling auto-flush.

In a purely network I/O-driven application, that obviously makes more sense. However, in the most common use cases, line-buffered I/O (Perl's default for TTYs) allows the program to flush the buffer less often and spend more time doing CPU work. The average user wouldn't notice the difference on a terminal or in a file.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜