&1 |") di-6ren">
gpt4 book ai didi

perl - 测量通过 perl "open"运行的程序的运行时间

转载 作者:行者123 更新时间:2023-12-01 13:36:16 24 4
gpt4 key购买 nike

我正在开发一个带有测试套件的库,该套件使用 Perl open 来运行它的测试。它看起来像这样:

open (MYOUT, "$myprog $arg1 $arg2 $arg3 2>&1 |") die "Bad stuff happened";

我真正想做的是测量$myprog 的运行时间。不幸的是,仅仅获取 open 命令周围的开始时间和结束时间只能大致获取启动进程所需的时间。

是否有某种方法可以强制 open 命令完成该过程(并因此准确地测量时间)或者可能有其他方法可以完成同样的事情?

关键限制是我们需要捕获(可能很多)STDOUTSTDERR

最佳答案

因为你打开了一个管道,你需要从打开开始之前到至少读取之后

use warnings;
use strict;
use Time::HiRes qw(gettimeofday tv_interval sleep);

my $t0 = [gettimeofday];

open my $read, '-|', qw(ls -l) or die "Can't open process: $!";

while (<$read>)
{
sleep 0.1;
print;
}

print "It took ", tv_interval($t0), " seconds\n";
# close pipe and check

或者,在管道上调用 close 之后(所有读取完成之后)为整个过程计时

my $t0 = [gettimeofday];
open my $read, '-|', qw(ls -l) or die "Can't open process: $!";
# ... while ($read) { ... }
close $read or
warn $! ? "Error closing pipe: $!" : "Exit status: $?";
print "It took ", tv_interval($t0), " seconds\n";

close阻塞并等待程序完成

Closing a pipe also waits for the process executing on the pipe to exit--in case you wish to look at the output of the pipe afterwards--and implicitly puts the exit status value of that command into $? [...]

有关状态检查,请参阅 $? variable in perlvarsystem

如果定时程序 fork 并且不以阻塞方式等待其子程序,这将无法正确地为它们计时。在这种情况下,您需要确定他们使用的资源(文件?)并对其进行监控。

我想补充一点,外部命令应该小心地放在一起,以避免 shell 注入(inject)的麻烦。一个好的模块是 String::ShellQuote .参见示例 this answerthis answer

使用捕获流的模块将使您从 shell 中解放出来,并可能打开其他方式来更可靠地运行和计时。一个好的是 Capture::Tiny (还有其他人)。

感谢HåkonHægland征求意见。感谢ikegami让我直截了当,使用close(而不是waitpid)。

关于perl - 测量通过 perl "open"运行的程序的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43080680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com