read
:
read
支持 PerlIO 层。read
可以与任何 Perl 文件句柄配合使用[1]。read
进行缓存。read
会在 8 KiB 的固定大小块中从系统获取数据[2]。read
如果请求的数据不足,可能会阻塞[3]。sysread
:
sysread
不支持 PerlIO 层(这意味着它需要一个原始的,即二进制的句柄)。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
适用于大读取。”正是所需的。当然,鉴于现实世界的无限可能性,它可能并不总是正确的,但我想要的是一个基本正确的Perl指南。 - G. CitoStream::Reader
。作为一项实验,我在Reader.pm
中将read
替换为sysread
,并获得了9-10%的吞吐量增加 - 这似乎太容易了。除了显而易见的部分(缓冲,编码),这只是基准测试和测试的问题吗?您能谈谈其中任何数据完整性、故障转移/鲁棒性元素吗? - G. Citosysread
成为一个有效的选项。 - ikegami读取(read��
(可能您打开了一个指向标量引用或用TIEHANDLE
绑定的东西的文件句柄),但只有具有正fileno()
值的内容才能进行sysread
操作。 - hobbs