Есть ли лучший способ определить прошедшее время в Perl? - PullRequest
41 голосов
/ 18 марта 2009
my $start_time = [Time::HiRes::gettimeofday()];
my $diff = Time::HiRes::tv_interval($start_time);

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

Ответы [ 4 ]

67 голосов
/ 18 марта 2009

Возможно. Зависит от того, что вы подразумеваете под «лучше».

Если вы запрашиваете «лучшее» решение с точки зрения функциональности , то это в значительной степени так.

Если вы запрашиваете «лучше» в смысле «менее неловкой» записи , то знайте, что в скалярном контексте 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);
18 голосов
/ 18 марта 2009

Зависит от того, что вы делаете. Если вы хотите измерить время настенных часов (количество фактического времени, которое прошло), вы не можете стать намного лучше. Если вы хотите измерить, как долго компьютер что-то делал, вы можете посмотреть на функцию times или команду time. Функция times в Perl возвращает список текущего накопленного времени для этого процесса в вашем коде и код любых модулей, которые вы используете, этот процесс в системных вызовах, все дочерние элементы этого процесса в коде пользователя и все это дочерние элементы процесса в системных вызовах.

#!/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";

Команда time в UNIX похожа по функции. Вы запускаете команду, подобную этой

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

в верхней части вашей программы.

1 голос
/ 18 марта 2009

Вот и все - это даст вам прошедшее время с высоким разрешением. Если, конечно, кто-то не работает с системными часами.

0 голосов
/ 24 декабря 2015

Это полезно для таймингов в работе, детализация одной секунды:

В начале ...

$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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...