有没有更好的方法来确定Perl中的已用时间?

时间:2009-03-18 00:24:43

标签: perl time

my $start_time = [Time::HiRes::gettimeofday()];
my $diff = Time::HiRes::tv_interval($start_time);

print "\n\n$diff\n";

4 个答案:

答案 0 :(得分:67)

可能。取决于“更好”的意思。

如果您要求在功能方面提供“更好”的解决方案 ,那么这就是它。

如果你在“不那么尴尬”的符号的意义上要求“更好”的,那么知道在标量上下文中,Time::HiRes::gettimeofday()将从纪元开始返回浮动秒数(带有表示微秒的小数部分,就像Time::HiRes::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);

答案 1 :(得分:18)

取决于你在做什么。如果你想测量挂钟时间(已经过去的实际时间量)你就不会好多了。如果您想测量计算机执行某些操作的时间,那么您可能需要查看times函数或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命令在功能上类似。你运行这样的命令

time ./script.pl

并输出类似这样的内容

real    0m0.692s
user    0m0.019s
sys     0m0.109s

其中real是挂钟时间,user和sys与上面的用户和系统相同。

time命令对于人类来说更容易使用,但times函数可以为您提供更多信息并且更容易融入计算机程序(此外,它还具有产生结果的好处。程序仍在运行。)

哦,我忘了提及$^T。此变量保存程序的开始时间,以秒为单位,因此,如果您只关心秒的粒度,您可以说

END { print "The program ran for ", time() - $^T, " seconds\n" }

靠近程序顶部。

答案 2 :(得分:1)

这就是它 - 它将为您提供高分辨率的经过时间。当然,除非有人对系统时钟感到困惑。

答案 3 :(得分:0)

这对于服务时间,一秒的粒度非常有用:

一开始......

$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";
}