繁体   English   中英

如何获取perl系统调用的CPU时间?

[英]How can I get the CPU time for a perl system call?

我有一个perl脚本,使用system()调用外部可执行文件。 我想测量这些外部程序所占用的CPU秒数。 理想情况下,我想使用shell builtin time命令运行它们(这是在Linux系统上)。 像这样的东西:

system("time /path/to/command")

现在, time其输出打印到stderr,但是为了这样做,启动它在单独的子shell中给出的命令。 这意味着为了在shell中手动运行时捕获时间输出,您需要显式使用子shell并重定向子shell的stderr:

$ time ( command > command.log 2> command.er) 2> time.out

文件time.out将具有time命令的输出,而command.er具有stderr command 不幸的是,括号打破了perl的系统调用:

$ time ( ls ) 2> er ## works
$ perl -e 'system("time (ls)")'
sh: 1: Syntax error: word unexpected (expecting ")")

这意味着我无法捕捉time的输出。 为了使事情变得更糟,这似乎取决于版本:

$ perl --version | head -n2
This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi

但如果我尝试使用更新版本的相同内容:

$ perl --version | head -n2
This is perl 5, version 24, subversion 1 (v5.24.1) built for x86_64-linux-thread-multi
$ perl -e 'system("time (ls)")'
file1

real    0m0.002s
user    0m0.000s
sys     0m0.000s

不幸的是,我需要在生产机器上运行,因此升级Perl不是一种选择。 那么,我如何在Perl 5.18中对系统调用进行计时? 我需要usersys值,所以简单地记录开始和结束时间将无济于事。 我愿意使用专用模块,如果这是必要的,虽然我更喜欢让我使用shell time的技巧。


更新:原来在行为上的差异是不是因为较新的perl版本,但是,相反,它是因为我测试了它的拱门系统,其上的/bin/shbash ,而其他命令正在对他们的Ubuntu系统上运行/bin/shdash ,一个不支持子shell括号的最小shell。

您可以使用Capture :: Tiny捕获Perl中几乎任何东西的STDOUT和STDERR。

use Capture::Tiny 'capture';

my ($stdout, $stderr, $exit) = capture { system "time ls" };

print $stderr;

由于某种原因,输出在我的系统上缺少一些空白,但是足够清楚,可以解析出你需要的东西。

0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 2272maxresident)k
0inputs+8outputs (0major+111minor)pagefaults 0swaps

你已经用bash测试了命令,但是你把它传给了sh

system("time (ls)")

是的缩写

system("/bin/sh", "-c", "time (ls)")

但你想要

system("/bin/bash", "-c", "time (ls)")
$ time ( ls ) 2> er ## works
$ perl -e 'system("time (ls)")'
sh: 1: Syntax error: word unexpected (expecting ")")

问题是,在第一种情况下,你的shell可能是/bin/bash而在第二种情况下,它是/bin/sh 如果要使用其他shell运行命令,可以使用system LIST表单:

system("/bin/bash", "-c", "time(ls)")

注1:有PERL5SHELL环境值,但这似乎在Win32上生效。

注意2:如果要测量子进程的CPU时间,可以使用Unix :: GetrusageBSD :: Resource模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM