web-dev-qa-db-fra.com

Existe-t-il un meilleur moyen de déterminer le temps écoulé en Perl?

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

print "\n\n$diff\n";
42
zzztimbo

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);
67
vladr

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.

18
Chas. Owens

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.

1
Andrew Barnett

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";
}
0
fyngyrz