[英]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.