`read`和`sysread`有什么区别?

20

readsysread 的文档非常相似。它们之间的区别是什么?


嗯,那是一个很好的问题。 - G. Cito
4
感谢 @G. Cito 提出这个问题。 - ikegami
1个回答

27
关于 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 文件句柄。
  • readselect 不兼容[5],而 sysread 兼容 select
  • read 可以为您执行解码操作,而 sysread 要求您自己进行解码。
  • read函数在读取非常小的数据时速度更快,而sysread函数在读取大量数据时速度更快。

  • 注:

    1. 这包括绑定文件句柄和使用 open(my $fh, '<', \$var) 创建的文件句柄。

    2. 在5.14之前,Perl以4 KiB块读入。自5.14以来,块的大小可以在构建 perl 时配置,默认为8 KiB。

    3. 根据我的经验,当从普通文件中读取数据时,read将确切地返回请求的数量(如果可能),但是从管道中读取数据时可能会返回较少的数据。这些结果并不保证。

    4. fileno返回这些文件句柄的非负数。这包括从普通文件、管道和套接字中读取的文件句柄,但不包括[1]中提到的那些。

    5. 我指的是由IO::Select调用的带有4个参数的函数。


    1
    很好的总结。应该在perlfunc中。这句话:“read适用于小读取,而sysread适用于大读取。”正是所需的。当然,鉴于现实世界的无限可能性,它可能并不总是正确的,但我想要的是一个基本正确的Perl指南。 - G. Cito
    1
    在回答另一个问题时,我使用了Stream::Reader。作为一项实验,我在Reader.pm中将read替换为sysread,并获得了9-10%的吞吐量增加 - 这似乎太容易了。除了显而易见的部分(缓冲,编码),这只是基准测试和测试的问题吗?您能谈谈其中任何数据完整性、故障转移/鲁棒性元素吗? - G. Cito
    1
    您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - ysth
    1
    @G. Cito,谈论“UTF-8模式”意味着它不仅是他们具有层次结构的可能性,而且它是一种支持的操作模式。这防止了sysread成为一个有效的选项。 - ikegami
    3
    此外,您可以从实际上不是文件的东西中读取(read��(可能您打开了一个指向标量引用或用TIEHANDLE绑定的东西的文件句柄),但只有具有正fileno()值的内容才能进行sysread操作。 - hobbs
    显示剩余2条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接