2009-03-18 10 views
38
my $start_time = [Time::HiRes::gettimeofday()]; 
my $diff = Time::HiRes::tv_interval($start_time); 

print "\n\n$diff\n"; 
+5

mieux dans quel sens? – ysth

Répondre

60

Eventuellement. Cela dépend de ce que vous entendez par "mieux".

Si vous demandez une «meilleure» solution en termes de fonctionnalité, alors c'est à peu près tout.

Si vous demandez un « meilleur » au sens de « moins maladroite » notation, sachez alors que, dans un contexte scalaire, Time::HiRes::gettimeofday() retournera secondes flottant depuis l'époque (avec la partie décimale représentant microsecondes), juste comme Time::HiRes::time() (ce qui est un bon remplacement de drop-in 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); 
1

C'est à peu près tout - cela vous donnera une haute résolution du temps écoulé. À moins, bien sûr, que quelqu'un ne se mêle de l'horloge du système.

18

Cela dépend de ce que vous êtes Faire. Si vous voulez mesurer l'heure de l'horloge murale (la durée réelle écoulée), vous ne pouvez pas vous améliorer. Si vous voulez mesurer combien de temps l'ordinateur a fait quelque chose, alors vous pouvez regarder la fonction times ou la commande time. La fonction times en Perl renvoie une liste du temps accumulé pour ce processus dans votre code et le code de tous les modules que vous utilisez, ce processus dans les appels système, tous les enfants du code utilisateur de ce processus 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 est similaire à la fonction. Vous exécutez une commande comme

time ./script.pl 

et sorties quelque chose comme ça

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

où est le temps réel d'horloge murale et l'utilisateur et 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 est en cours d'exécution).

Oh, j'ai oublié de mentionner $^T. Cette variable contient l'heure de début du programme en quelques secondes depuis l'époque, donc si vous ne vous préoccupez une granularité de secondes vous pouvez simplement dire

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

près du haut de votre programme.

0

Ceci est utile pour connaître les horaires en service, la granularité d'une seconde:

Au début ...

$debugtimer = time; 
$debugstr = ""; 

... partout et partout où vous aimez ...

kerchunk("message") # message is short description of location in code 

... la 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"; 
} 
Questions connexes