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

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

besser in welchem ​​Sinne? – ysth

Antwort

60

Möglicherweise. Hängt davon ab, was du mit "besser" meinst.

Wenn Sie nach einer "besseren" Lösung in Bezug auf die Funktionalität fragen, dann ist dies ziemlich viel.

Wenn Sie einen „besseren“ im Sinne von „weniger umständlich“ Notation fragen, wissen dann, dass im skalaren Kontext Time::HiRes::gettimeofday() seit Epoche floating Sekunden zurück (mit dem Bruchteil Mikrosekunden darstellt), um nur wie Time::HiRes::time() (was ein guter Drop-in-Ersatz für den Standard time() Funktion ist.)

my $start = Time::HiRes::gettimeofday(); 
... 
my $end = Time::HiRes::gettimeofday(); 
printf("%.2f\n", $end - $start); 

oder:

use Time::HiRes qw(time); 

my $start = time(); 
... 
my $end = time(); 
printf("%.2f\n", $end - $start); 
1

Das ist ziemlich viel - das wird Ihnen eine hohe Auflösung verstrichene Zeit geben. Es sei denn, jemand vermasselt die Systemuhr.

18

Hängt davon ab, was du bist tun. Wenn Sie die Wanduhrzeit messen möchten (die tatsächliche Zeit, die verstrichen ist), können Sie nicht viel besser werden. Wenn Sie messen möchten, wie lange der Computer gerade etwas ausgeführt hat, sollten Sie sich die Funktion times oder den Befehl time ansehen. Die times-Funktion in Perl gibt eine Liste der aktuellen Zeit für diesen Prozess in Ihrem Code und den Code der von Ihnen verwendeten Module, diesen Prozess in Systemaufrufen, alle untergeordneten Prozesse dieses Prozesses im Benutzercode und alle untergeordneten Prozesse zurück in Systemaufrufen.

#!/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"; 

Der time in UNIX-Befehl ist in der Funktion ähnlich. Sie führen einen Befehl wie dieser

time ./script.pl 

und es gibt so etwas wie dieses

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

wo reale die Wanduhr Zeit und Benutzer und sys sind die gleichen wie Benutzer- und System oben. Der time Befehl ist für einen Menschen einfacher zu benutzen, aber die times Funktion gibt Ihnen mehr Informationen und ist leichter in ein Computerprogramm zu integrieren (und hat den Vorteil, Ergebnisse zu erzeugen, während ein Programm noch läuft).

Oh, ich vergaß zu erwähnen $^T. Diese Variable enthält die Startzeit des Programms in Sekunden seit der Epoche, also wenn Sie nur über eine Granularität von Sekunden Pflege können Sie einfach

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

in der Nähe der Spitze des Programms sagen.

0

Dies ist nützlich für die in-Service-Timings, Granularität von einer Sekunde:

Am Anfang ...

$debugtimer = time; 
$debugstr = ""; 

... überall und überall Sie mögen ...

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

... Programmende ...

print "timings: $debugstr"; 

... und mit dem U-Boote:

sub kerchunk 
{ 
    my ($msg) = shift; 
    my $pertock = time; 
    my $kch = abs($debugtimer - $pertock); 
    $debugstr .= "Elapsed at $msg: $kch<br>\n"; 
} 
Verwandte Themen