【发布时间】:2016-07-18 19:52:20
【问题描述】:
【问题讨论】:
-
grrr :-) 这是个好问题
-
感谢@G。 Cito 提出这个问题。
标签: perl io system-calls
【问题讨论】:
标签: perl io system-calls
关于read:
read 支持 PerlIO 层。read 适用于任何 Perl 文件句柄[1]。read 缓冲区。read 以固定大小的 8 KiB 块从系统获取数据[2]。read 可能会阻止[3]。关于sysread:
sysread 不支持 PerlIO 层(这意味着它需要一个原始的 a.k.a. 二进制句柄)。sysread 仅适用于映射到系统文件句柄/描述符的 Perl 文件句柄[4]。sysread 不缓冲。sysread 执行单个系统调用。sysread 如果有数据可以返回,则立即返回,即使数据量小于请求的数量。总结和结论:
read 适用于任何 Perl 文件句柄,而 sysread 仅限于映射到系统文件句柄/描述符的 Perl 文件句柄。read 与 select 不兼容[5],而 sysread 与 select 兼容。read 可以为你解码,而sysread 需要你自己解码。read 对于非常小的读取应该更快,而sysread 对于非常大的读取应该更快。注意事项:
例如,这些包括绑定的文件句柄和使用 open(my $fh, '<', \$var) 创建的句柄。
在 5.14 之前,Perl 读取 4 KiB 块。从 5.14 开始,在构建 perl 时可以配置块的大小,默认为 8 KiB。
根据我的经验,read 在从普通文件读取时将准确返回请求的数量(如果可能),但在从管道读取时可能返回更少。这些结果绝不能保证。
fileno 为这些返回一个非负数。例如,这些包括从普通文件、管道和套接字读取的句柄,但不包括 [1] 中提到的句柄。
我指的是 IO::Select 调用的 4 参数。
【讨论】:
read 对于小读取应该更快,而sysread 对于大读取应该更快。”正是需要的。当然,考虑到真实单词的无限可能性,它可能并不总是正确,但我想要的是一个最真实的 perlish 指南。
Stream::Reader。作为一个实验,我在Reader.pm 中用sysread 替换了read,并获得了9-10% 的吞吐量——这似乎太容易了。除了明显的位(缓冲、编码)之外,这只是基准测试和测试的问题吗?您能谈谈其中的任何数据完整性、故障转移/稳健性元素吗?
sysread 成为有效选项。
read来自实际上不是文件的东西(也许你打开了一个标量引用或TIEHANDLEd的文件句柄),但你只能sysread带有a的东西积极fileno().