Подтвердить что ты не робот

Есть ли лучший способ определить прошедшее время в Perl?

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

print "\n\n$diff\n";
4b9b3361

Ответ 1

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

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

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

Ответ 2

В зависимости от того, что вы делаете. Если вы хотите измерить время настенных часов (количество фактического времени, прошедшего), вы не сможете получить гораздо больше. Если вы хотите измерить, как долго компьютер что-то делает, вы можете посмотреть 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 - это время настенных часов, а пользователь и sys - то же самое, что и пользователь и система выше.

Команда time легче использовать человеку, но функция times дает вам больше информации и легче вписывается в компьютерную программу (плюс она имеет преимущество при получении результатов, пока программа все еще работает).

О, я забыл упомянуть $^T. Эта переменная содержит время начала программы в секундах с момента эпохи, поэтому, если вы только заботитесь о детализации секунд, вы можете просто сказать

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

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

Ответ 3

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

Ответ 4

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

В начале...

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