File Coverage

blib/lib/Statistics/CountAverage.pm
Criterion Covered Total %
statement 17 51 33.3
branch 0 4 0.0
condition 1 17 5.8
subroutine 4 10 40.0
pod 6 7 85.7
total 28 89 31.4


line stmt bran cond sub pod time code
1             package Statistics::CountAverage;
2 1     1   22776 use strict;
  1         3  
  1         31  
3 1     1   4 use warnings;
  1         2  
  1         37  
4              
5             our $VERSION = '0.02';
6 1     1   16319 use Time::HiRes qw(gettimeofday);
  1         4228  
  1         5  
7              
8             sub new {
9 1     1 0 11 my $class = shift;
10 1         2 my $len = shift;
11 1         4 my $self = bless {}, $class;
12 1   50     10 $self->{len} = $len || 10;
13 1         3 $self->{count} = 0;
14 1         2 $self->{time} = 0;
15 1         13 $self->{ary} = [{count => 0, time => scalar gettimeofday(),diff => 0}];
16 1         8 return $self;
17             }
18             # $obj->count(100) - подсчитать 100 событий
19             sub count {
20 0     0 1   my $self = shift;
21 0   0       my $add = shift || 1 ;
22              
23 0           my $now = gettimeofday();
24 0           my $prev = $self->{ary}[-1]{time};
25 0           my $diff = $now - $prev;
26              
27 0           my $tmp = {count => $add, time => $now, diff => $diff};
28              
29 0           push @{$self->{ary}},$tmp;
  0            
30 0           $self->{count} += $add;
31 0           $self->{time} += $diff;
32            
33 0 0         if(@{$self->{ary}} > $self->{len}){
  0            
34 0           $tmp = shift @{$self->{ary}};
  0            
35 0           $self->{count} -= $tmp->{count};
36 0           $self->{time} -= $tmp->{diff};
37             }
38             }
39             # $obj->check(10) - возвращает true 1 раз каждые 10 секунд
40             # вернет true если со времени последнего возврата true прошло <= 10 секунд
41             sub check {
42 0     0 1   my $self = shift;
43 0   0       my $to = shift || 1;
44 0           my $now = gettimeofday();
45 0 0 0       if(($self->{last} ||= $now) + $to > $now){
46 0           return 0;
47             }
48 0           $self->{last} = $now;
49             }
50             # число событий за секунду
51             sub speed {
52 0     0 1   my $self = shift;
53 0   0       return $self->{count}/($self->{time}||1);
54             }
55             # число подсчетов за секунду
56             sub rate {
57 0     0 1   my $self = shift;
58 0   0       return @{$self->{ary}}/($self->{time}||1);
  0            
59             }
60             # количество событий за подсчет
61             sub avg {
62 0     0 1   my $self = shift;
63 0           return $self->{count}/@{$self->{ary}};
  0            
64             }
65             sub stat {
66 0     0 1   my $self = shift;
67             return +{
68 0           speed => $self->{count}/($self->{time}||1),
69 0           rate => @{$self->{ary}}/($self->{time}||1),
70 0   0       avg => $self->{count}/@{$self->{ary}},
      0        
71             };
72             }
73              
74             1;
75             __END__