51 votes

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

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

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

77voto

vladr Points 34562

Peut-être. Dépend de ce que tu veux dire par "mieux".

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

Si vous demandez un "mieux" dans le sens de "moins difficile" de la notation, alors savoir que, dans un contexte scalaire, Time::HiRes::gettimeofday() sera de retour flottant de secondes depuis l'epoch (avec la partie fractionnaire représentant microsecondes), tout comme Time::HiRes::time() (ce qui est une bonne chute en remplacement de la norme time() de la fonction.)

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

21voto

Chas. Owens Points 40887

Dépend de ce que vous faites. Si vous voulez mesurer la paroi de l'horloge (la quantité réelle de temps qui s'est écoulé), vous ne pouvez pas obtenir beaucoup mieux. Si vous voulez mesurer combien de temps l'ordinateur a été de faire quelque chose, alors vous voudrez peut-être regarder à l' times de la fonction ou de l' time commande. L' times fonction en Perl renvoie une liste de l'actuel cumul du temps de ce processus dans votre code et le code de tous les modules que vous utilisez ce processus en appels système, l'ensemble de ce processus, les enfants du code de l'utilisateur, et l'ensemble de ce processus, les enfants de 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";

L' time commande UNIX est similaire à la fonction. Vous exécutez une commande comme ceci

time ./script.pl

et elle renvoie à quelque chose comme ceci

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

où est le réel, c'est le mur le temps de l'horloge et de l'utilisateur et sys sont les mêmes que l'utilisateur et le système ci-dessus.

L' time commande est plus facile pour un homme d'utiliser, mais l' times fonction vous donne plus d'informations et est plus facile à intégrer dans un programme d'ordinateur (en plus il a l'avantage de produire des résultats tout un programme est toujours en cours d'exécution).

Oh, j'ai oublié de mentionner $^T. Cette variable contient l'heure de début du programme en secondes depuis l'epoch, donc si vous ne se soucient que d'une granularité de secondes, vous pouvez juste dire

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

près du haut de votre programme.

1voto

Andrew Barnett Points 2324

C'est à peu près tout - cela vous donnera du temps écoulé en haute résolution. À moins que, bien sûr, quelqu'un ne vienne perturber l'horloge système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X