有更好的方法来确定在Perl中花费的时间?
my $start_time = [Time::HiRes::gettimeofday()]; my $diff = Time::HiRes::tv_interval($start_time); print "\n\n$diff\n";
有可能。 取决于你的意思是“更好”。
如果您在function方面要求“更好”的解决scheme,那么这就相当多了。
如果你要求的是“ 不太笨拙”的记号 ,那么就知道,在标量上下文中, Time::HiRes::gettimeofday()
将返回从epoch开始的浮动秒数(小数部分表示微秒) ,就像Time::HiRes::time()
(这是标准time()
函数的一个很好的替代品time()
。
my $start = Time::HiRes::gettimeofday(); ... my $end = Time::HiRes::gettimeofday(); printf("%.2f\n", $end - $start);
要么:
use Time::HiRes qw( time ); my $start = time(); ... my $end = time(); printf("%.2f\n", $end - $start);
取决于你在做什么。 如果你想测量挂钟时间(经过的实际时间量),你不会好得多。 如果你想测量电脑已经做了多长时间,那么你可能要看看times
function或time
命令。 Perl中的times
函数返回代码中当前累计时间的列表,以及您正在使用的任何模块的代码,系统调用中的此过程,用户代码中的此过程的所有子代以及此过程的所有子代在系统调用中。
#!/usr/bin/perl use strict; use warnings; use Time::HiRes; my $start_time = [Time::HiRes::gettimeofday()]; . . . my ($user, $system, $child_user, $child_system) = times; print "wall clock time was ", Time::HiRes::tv_interval($start_time), "\n", "user time for $$ was $user\n", "system time for $$ was $system\n", "user time for all children was $child_user\n", "system time for all children was $child_system\n";
UNIX中的time
命令function相似。 你像这样运行一个命令
time ./script.pl
并输出这样的东西
real 0m0.692s user 0m0.019s sys 0m0.109s
其中real time是挂钟时间,user和sys与上面的user和system是一样的。
time
命令对于人类来说更容易使用,但times
函数为您提供了更多的信息,更容易适应计算机程序(另外还有一个程序仍在运行时产生结果的好处)。
哦,我忘了提及$^T
这个variables保存自纪元以来的程序开始时间,所以如果你只关心秒的粒度,你可以说
END { print "The program ran for ", time() - $^T, " seconds\n" }
靠近你的程序的顶部。
这几乎是 – 这会给你高分辨率的时间。 当然,除非有人用系统时钟混淆。
这对于服务时间,一秒的粒度是有用的:
开始…
$debugtimer = time; $debugstr = "";
随时随地你喜欢…
kerchunk("message") # message is short description of location in code
…节目结束…
print "timings: $debugstr";
…和你的潜艇:
sub kerchunk { my ($msg) = shift; my $pertock = time; my $kch = abs($debugtimer - $pertock); $debugstr .= "Elapsed at $msg: $kch<br>\n"; }