获得delta的基准对象方法

时间:2012-06-13 08:26:25

标签: perl benchmarking accessor

我使用Benchmark计算网络服务的执行时间。

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 wallclock secs(0.42 usr + 0.00 sys = 0.42 CPU)

因为我想知道webservice对不同输入值的反应有多快,所以这将进入一个循环。我想在数组中保存delta(0.433091),以便稍后计算平均值。

Perldoc说timediff

  

返回两个Benchmark时间之间的差异,作为适合传递给timestr()的Benchmark对象。

所以我认为必须有更多的方法,一定不要吗?

我想到了两种方法来获得这个数字:

  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];
    
  3. 第一种方法似乎很简单,但我不喜欢它。

    第二种方法似乎非常不安全。直接访问对象数据永远不是一个好主意。当然必须有一个存取方法。

    你有什么建议?有谁知道这个Benchmark对象的访问者?或者我应该这样做吗?你会用哪种方式?

1 个答案:

答案 0 :(得分:1)

一般来说,你应该避免查看对象的私有部分。

该类实际上提供了获取该数字的访问器:

say $td->real;