我如何修改<>
操作缓冲区大小的位置来确定?
<>
读入,可以长到任意大小的标,所以我想你指的是传递给read
系统调用的缓冲区的大小。
在5.14之前,Perl从4个KiB块中读取文件句柄。 5.14使这种配置成为可能,默认值为8 KiB。
$ perl -e'print("x" x 9_999, "\n") for 1..2' >large_lines
$ strace 5.10.1t/bin/perl -e'my $line = <>' large_lines 2>&1 | grep read.*xxx
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 4096) = 4096
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 4096) = 4096
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 4096) = 4096
$ strace 5.14.2t/bin/perl -e'my $line = <>' large_lines 2>&1 | grep read.*xxx
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
使用下面的命令
./Configure -Accflags=-DPERLIOBUF_DEFAULT_BUFSIZ=8192
这适用于所有缓冲读取功能,包括read
,readline
(对于该<>
是别名)它只能被配置为当perl
构建,readpipe
和eof
,但不是sysread
。
注意,设置$/
到为数字的参考将导致readline
(<>
)作为read
,这仍然是进行缓冲。
$ strace perl -e'$/ = \8193; my $block = <>' large_lines 2>&1 | grep read.*xxx
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
read(3, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8192) = 8192
如果你真的要执行一个read
系统调用,你需要使用sysread
。
$ strace perl -e'sysread(STDIN, $buf, 8193)' <large_lines 2>&1 | grep read.*xxx
read(0, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"..., 8193) = 8193
我们在这里说话多长时间?我认为没有什么特别的原因可以解释为什么'缓冲区'大小特别成问题 - 我已经使用了这种结构和记录分隔符 - 很多'行'长 - 并且它工作得很好。你确定这是'时'循环,这会减慢你的速度吗? – Sobrique
@Sobrique我不确定,但是当我将这段代码放在一个文件中的时候,它的行数很短,它的功能非常强大,并且运行速度非常快。线条很长。把它看作好像你有一个大文本文件全部打包成一行或两行(我对这些文件的格式没有任何控制权)。 – yonyon100
但你确实有能力设置'$ /' - 记录分隔符。有什么合适的,你可以'分裂'线? – Sobrique