簡體   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