Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
禁用不适当的缓冲Perl_Perl - Fatal编程技术网

禁用不适当的缓冲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
返回当前选择的文件句柄)。

是,它对性能有影响;缓冲就是这样。