我有一个网络守护进程,它在TCP套接字上接收固定长度(44字节)的消息。
我正试图确定用sysread读取的最佳字节长度是多少。当然,我可以做一个循环来进行44字节的系统读取,但是我想找出一个最佳的大小。
我可以看到一个优势,不必说,一兆字节的数据做子串,但我也可以看到为什么做一千次系统读取调用会导致缓慢。
在公共互联网上进行系统读取是否有一个好的大小建议?
编辑:
脚本得到一堆44字节的消息,它们被排队。

最佳答案

越大越好!sysread将在任何字节可用时立即返回。
因为您永远不能保证得到一个完整的消息,而且也永远不能保证只有一个消息,所以您需要在Perl端有一个循环。因为Perl端已经有了一个循环,所以最好一次从系统中获取尽可能多的数据,以避免不必要的系统调用。

use constant READ_SIZE => 65*1024;

my $buf = '';
while (1) {
   my $rv = sysread($fh, $buf, READ_SIZE, length($buf));
   die if !defined($rv);
   last if !$rv;

   while ($buf =~ s/^(.{44})//s) {
      my $msg = $1;
      process_msg($msg);
   }
}

选择一个尺寸并监视$buf的尺寸。如果经常接近READ_SIZE,则增加READ_SIZE

关于linux - Linux中Perl的sysread开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10423187/

10-15 03:32