为什么默认情况下不会自动刷新缓冲区?

时间:2011-09-13 16:13:31

标签: perl buffer autoflush

我最近有幸在我的Perl脚本中设置$| = 1;,以帮助它更快地与管道中的另一个应用程序进行对话。

我很好奇为什么这不是默认设置。换句话说,如果我的缓冲区立即被刷新,我会失去什么?

3 个答案:

答案 0 :(得分:13)

通过系统调用写入文件描述符,系统调用很慢。

只有在写入一定量的数据后才缓冲流并刷新它是一种节省系统调用的方法。

答案 1 :(得分:8)

对它进行基准测试,你会明白的。

缓冲取决于输出句柄的设备类型:ttys是行缓冲的;管道和插座是管道缓冲的;磁盘是块缓冲的。

这只是基本编程。这不是Perl的事情。

答案 2 :(得分:3)

刷新I / O缓冲区的次数越少,代码通常就越快(因为它不必经常进行系统调用)。因此,通过启用自动刷新,您的代码将花费更多时间等待I / O.

在纯粹的网络I / O驱动的应用程序中,这显然更有意义。但是,在最常见的用例中,行缓冲I / O(Perl的TTY默认值)允许程序更少地刷新缓冲区并花费更多时间进行CPU工作。普通用户不会注意到终端或文件中的差异。