禁用不适当的缓冲Perl
我使用的是一个perl文件解析器,它打印它处理的每个文件的名称。但我注意到这些打印输出出现了问题,引起了我的注意。在进一步挖掘之后,我发现这是因为Perl正在使用缓冲,并且仅当缓冲区已满时才将这些打印语句释放到输出中。我还了解到,有一个解决办法是“使文件句柄变热”。无论何时打印到热文件句柄,Perl都会立即刷新缓冲区。所以我的问题是: 使文件句柄变热有什么后果吗?禁用不适当的缓冲Perl,perl,Perl,我使用的是一个perl文件解析器,它打印它处理的每个文件的名称。但我注意到这些打印输出出现了问题,引起了我的注意。在进一步挖掘之后,我发现这是因为Perl正在使用缓冲,并且仅当缓冲区已满时才将这些打印语句释放到输出中。我还了解到,有一个解决办法是“使文件句柄变热”。无论何时打印到热文件句柄,Perl都会立即刷新缓冲区。所以我的问题是: 使文件句柄变热有什么后果吗? 在刷新与刷新之前让缓冲区填满是否会立即对性能产生影响?Perl根据上下文使用不同的输出缓冲模式:写入文件等。缓冲区分块(这对性能很重
在刷新与刷新之前让缓冲区填满是否会立即对性能产生影响?Perl根据上下文使用不同的输出缓冲模式:写入文件等。缓冲区分块(这对性能很重要),如果perl有理由相信输出到终端,则在每行之后刷新句柄<默认情况下,code>STDERR是无缓冲的 您可以通过将特殊的
$|
变量设置为真值,来停用当前选择的文件句柄的缓冲。但是,这可以更好地表述为:
use IO::File; # on older perls
...
$some_file_handle->autoflush(1);
print { $some_file_handle } "this isn't buffered";
这样做的好处是,您不必对STDOUT
以外的句柄使用恼人的select
功能。为什么此方法称为“自动刷新”
?文件句柄仍处于缓冲状态,但在每次打印
或say
调用后,缓冲区会自动刷新
小心:autoflush
方法在真正古老的perl上不起作用,因为文件句柄还不是对象。在这种情况下,请执行选择舞蹈:
my $old_fh = select $my_$fh;
$| = 1;
select $old_fh;
print { $my_fh } "this isn't buffered";
(select
返回当前选择的文件句柄)。是,它对性能有影响;缓冲就是这样。