2

ベンチマークを使用してWebサービスの実行時間を計っています。

use strict; use warnings;
use feature qw(say);
use Benchmark qw(:hireswallclock);

my $t0 = Benchmark->new;
1 for (1..10000000); # webservice request goes here
my $t1 = Benchmark->new;
my $td = timediff($t1, $t0);
say 'Code took ' . timestr($td);

これは言う:

コードは0.433091ウォールクロック秒かかりました(0.42 usr + 0.00 sys = 0.42 CPU)

Webサービスがさまざまな入力値にどれだけ速く反応するか知りたいので、これはループに入ります。0.433091後で平均を計算できるように、デルタ()だけを配列に保存したいと思います。

Perldocは次のように述べていtimediffます:

timestr()に渡すのに適したBenchmarkオブジェクトとして、2つのBenchmark時間の差を返します。

だから私はもっといくつかの方法があるに違いないと思っていますね。

その数を取得する2つの方法を考えました。

  1. 正規表現を使用します。

    timestr($td) =~ m/([\d\.]+) /;
    say $1;
    
  2. 直接アクセスする:

    use Data::Dumper;
    print Dumper $td;
    

    これにより、次のようになります。

    $VAR1 = bless( [
                     '0.433090925216675',
                     '0.422',
                     '0',
                     0,
                     0,
                     0
                   ], 'Benchmark' );
    

    だから私はただ:

    say $td->[0];
    

最初の方法は簡単な方法のように思えますが、私はそれが好きではありません。

2番目の方法は非常に危険なようです。オブジェクトデータに直接アクセスすることは決して良い考えではありません。確かに、これにはアクセサメソッドが必要です。

あなたの提案は何ですか?Benchmarkこのオブジェクトのアクセサーについて知っている人はいますか?それとも私はこれを別の方法で行う必要がありますか?どちらの方法を使用しますか?

4

1 に答える 1

1

一般的に、オブジェクトのプライベート部分を見ないようにするのは正しいことです。

このクラスは、実際にはその番号を取得するためのアクセサーを提供します。

say $td->real;
于 2012-06-13T10:28:42.027 に答える