my $start_time = [Time::HiRes::gettimeofday()];
my $diff = Time::HiRes::tv_interval($start_time);
print "\n\n$diff\n";
Peut-être. Cela dépend de ce que vous entendez par "mieux".
Si vous demandez une "meilleure" solution en termes de fonctionnalités , alors c'est à peu près tout.
Si vous demandez une "meilleure" dans le sens d'une notation "moins maladroite" , alors sachez que, dans un contexte scalaire, Time::HiRes::gettimeofday()
renverra des secondes flottantes depuis Epoch (avec la partie fractionnaire représentant les microsecondes), tout comme Time::HiRes::time()
(qui est un bon remplacement de remplacement pour la fonction standard time()
.)
my $start = Time::HiRes::gettimeofday();
...
my $end = Time::HiRes::gettimeofday();
printf("%.2f\n", $end - $start);
ou:
use Time::HiRes qw( time );
my $start = time();
...
my $end = time();
printf("%.2f\n", $end - $start);
Cela dépend de ce que vous faites. Si vous voulez mesurer le temps de l'horloge murale (le temps réel qui s'est écoulé), vous ne pouvez pas faire mieux. Si vous voulez mesurer depuis combien de temps l'ordinateur fait quelque chose, vous pouvez regarder la fonction times
ou la fonction time
commander. La fonction times
en Perl renvoie une liste du temps cumulé actuel pour ce processus dans votre code et le code des modules que vous utilisez, ce processus dans les appels système, tous les enfants de ce processus dans le code utilisateur, et tous les enfants de ce processus dans les appels système.
#!/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";
La commande time
sous UNIX a une fonction similaire. Vous exécutez une commande comme celle-ci
time ./script.pl
et il produit quelque chose comme ça
real 0m0.692s
user 0m0.019s
sys 0m0.109s
où réel est l'heure de l'horloge murale et l'utilisateur et le sys sont les mêmes que l'utilisateur et le système ci-dessus.
La commande time
est plus facile à utiliser pour un humain, mais la fonction times
vous donne plus d'informations et est plus facile à intégrer dans un programme informatique (en plus, elle a l'avantage de produire des résultats pendant qu'un programme fonctionne toujours).
Oh, j'ai oublié de mentionner $^T
. Cette variable contient l'heure de début du programme en secondes depuis l'époque, donc si vous ne vous souciez que d'une granularité de secondes, vous pouvez simplement dire
END { print "The program ran for ", time() - $^T, " seconds\n" }
vers le haut de votre programme.
C'est à peu près tout - cela vous donnera un temps écoulé à haute résolution. Sauf, bien sûr, si quelqu'un dérange l'horloge système.
Ceci est utile pour les temporisations en service, granularité d'une seconde:
Au début...
$debugtimer = time;
$debugstr = "";
... partout et où vous voulez ...
kerchunk("message") # message is short description of location in code
... fin du programme ...
print "timings: $debugstr";
... et avec vos sous-marins:
sub kerchunk
{
my ($msg) = shift;
my $pertock = time;
my $kch = abs($debugtimer - $pertock);
$debugstr .= "Elapsed at $msg: $kch<br>\n";
}