[英]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中对系统调用进行计时? 我需要user
和sys
值,所以简单地记录开始和结束时间将无济于事。 我愿意使用专用模块,如果这是必要的,虽然我更喜欢让我使用shell time
的技巧。
更新:原来在行为上的差异是不是因为较新的perl版本,但是,相反,它是因为我测试了它的拱门系统,其上的/bin/sh
是bash
,而其他命令正在对他们的Ubuntu系统上运行/bin/sh
是dash
,一个不支持子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 :: Getrusage或BSD :: Resource模块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.