3

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

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

4

3 回答 3

13

写入文件描述符是通过系统调用完成的,并且系统调用很慢。

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

于 2011-09-13T16:15:15.157 回答
8

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

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

这只是基本的编程。这不是 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 回答