web-dev-qa-db-ja.com

Perlで経過時間を判断するより良い方法はありますか?

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

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

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

機能性の観点から「より良い」解決策を求めている場合、これでほぼ間違いありません。

「より扱いにくい」表記の意味で「より良い」を求めている場合、スカラーコンテキストでは、Time::HiRes::gettimeofday()は、エポック以降の浮動秒を返します(小数部はマイクロ秒を表します) Time::HiRes::time() (標準の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);
67
vladr

何をしているのかに依存します。壁時計の時間(経過した実際の時間)を測定したい場合、これ以上改善することはできません。コンピュータが何かを実行している時間を測定する場合は、 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

そして、それはこのようなものを出力します

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

ここで、realは実時間であり、userとsysは上記のユーザーとシステムと同じです。

timeコマンドは人間にとって使いやすいですが、times関数はより多くの情報を提供し、コンピュータープログラムへの適合が容易です(さらに、プログラムの実行中に結果を生成するという利点もあります)まだ実行中です)。

ああ、私は$^T。この変数は、プログラムの開始時刻をエポックからの秒数で保持します。したがって、秒単位の細かさだけを気にする場合は、

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

プログラムの上部近く。

18
Chas. Owens

それはほとんどそれです-それはあなたに高解像度の経過時間を与えます。もちろん、誰かがシステムクロックを台無しにしない限り。

1
Andrew Barnett

これは、1秒の粒度のインサービスタイミングに役立ちます。

はじめに...

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