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

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

どのような意味で良いですか? – ysth

答えて

60

おそらく。あなたが「より良い」という意味に依存します。

の機能については、より良いソリューションをお探しの場合は、、これはかなりです。

あなたはスカラーコンテキストでは、Time::HiRes::gettimeofday()だけで、(マイクロ秒を表す小数部分で)エポックからの浮動秒を返します、ということを知った後、「より良い」のために「あまりぎこちない」表記の意味でのを求めている場合(標準time()機能のための良好なドロップイン交換である。)のようなTime::HiRes::time()

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

か:

use Time::HiRes qw(time); 

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

それはかなりです - それはあなたに高分解能経過時間を与えるでしょう。もちろん、誰かがシステムクロックを使いこなす場合を除きます。

18

はあなたが何であるかに依存しますやって壁時計の時間(経過した実際の時間)を測定したい場合は、はるかに良くなることはありません。コンピュータが何かしている時間を測定する場合は、times関数またはtimeコマンドを調べるとよいでしょう。 Perlのtimes関数は、コード中のこのプロセスの現在の累積時間と、使用しているモジュールのコード、このプロセスのシステムコール、このプロセスのすべてのユーザーコード、およびこのプロセスのすべての子のリストを返しますシステムコールで。

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

UNIXにおけるtimeコマンドは、機能的に類似しています。あなたはこの

time ./script.pl 

のようなコマンドを実行し、それが本当のウォールクロック時間とユーザーがいるとsysが上記のユーザーとシステムと同じであり、この

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

ようなものを出力します。

timeコマンドは人間が使用する方が簡単ですが、times関数を使用すると、より多くの情報が得られ、コンピュータプログラムに組み込むのが容易になります(プログラムが実行されている間も結果が得られます)。

ああ、私は$^Tを言いました。この変数はエポックからの秒数でのプログラムの開始時刻を保持しているので、あなただけ秒の細かさを心配している場合、あなたは自分のプログラムの先頭近く

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

を言うことができます。

0

これは、二番目の細かさで、サービスのタイミングのために有用である:

開始時...

$debugtimer = time; 
$debugstr = ""; 

...どこでも、どこでもあなたが好き...

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

...プログラムの終わり...

print "timings: $debugstr"; 

...そして、あなたの潜水艦を持つ:

sub kerchunk 
{ 
    my ($msg) = shift; 
    my $pertock = time; 
    my $kch = abs($debugtimer - $pertock); 
    $debugstr .= "Elapsed at $msg: $kch<br>\n"; 
} 
関連する問題