File Coverage

blib/lib/App/plackbench/Stats.pm
Criterion Covered Total %
statement 68 68 100.0
branch 16 16 100.0
condition 2 2 100.0
subroutine 18 18 100.0
pod 11 12 91.6
total 115 116 99.1


line stmt bran cond sub pod time code
1             package App::plackbench::Stats;
2             $App::plackbench::Stats::VERSION = '0.7';
3 6     6   143727 use strict;
  6         11  
  6         255  
4 6     6   47 use warnings;
  6         9  
  6         422  
5 6     6   551 use autodie;
  6         23281  
  6         49  
6 6     6   41786 use v5.10;
  6         44  
7              
8 6     6   47 use List::Util qw( sum reduce );
  6         11  
  6         6224  
9              
10             sub new {
11 32     32 1 283661 my $class = shift;
12 32         129 my @self = sort { $a <=> $b } @_;
  94         199  
13 32         302 return bless \@self, $class;
14             }
15              
16             sub insert {
17 44     44 1 105 my $self = shift;
18 44         75 my $n = shift;
19              
20 44         65 push @{$self}, $n;
  44         125  
21 44         115 return $self->count();
22             }
23              
24             sub finalize {
25 9     9 0 20 my $self = shift;
26              
27 9         18 @{$self} = sort { $a <=> $b } @{$self};
  9         36  
  70         117  
  9         43  
28 9         63 return $self;
29             }
30              
31             sub count {
32 105     105 1 683 my $self = shift;
33 105         148 return scalar @{$self};
  105         364  
34             }
35              
36             sub mean {
37 7     7 1 25 my $self = shift;
38              
39 7 100       20 return unless $self->count();
40 6         39 return $self->elapsed() / $self->count();
41             }
42              
43             sub median {
44 5     5 1 23 my $self = shift;
45              
46 5 100       14 return unless $self->count();
47              
48 4 100       13 if ($self->count() % 2 == 1) {
49 2         20 return $self->[$self->count() / 2];
50             }
51              
52 2         9 my $index_a = ($self->count() / 2) + 0.5;
53 2         7 my $index_b = ($self->count() / 2) - 0.5;
54 2         7 my $a = $self->[$index_a];
55 2         6 my $b = $self->[$index_b];
56 2         13 return ($a + $b) / 2;
57             }
58              
59             sub min {
60 4     4 1 16 my $self = shift;
61              
62 4 100       29 return unless $self->count();
63 3         16 return $self->[0];
64             }
65              
66             sub max {
67 4     4 1 13 my $self = shift;
68 4 100       14 return unless $self->count();
69 3         27 return $self->[-1];
70             }
71              
72             sub standard_deviation {
73 3     3 1 14 my $self = shift;
74              
75 3 100       23 return 0 unless $self->count();
76 2         8 my $mean = $self->mean();
77              
78             my $differences_sum = reduce {
79 18     18   39 $a + ( ( $b - $mean )**2 );
80             }
81 2         14 0, @{$self};
  2         15  
82              
83 2         14 my $sd = sqrt( $differences_sum / $self->count() );
84 2         12 return $sd;
85             }
86              
87             sub percentile {
88 13     13 1 104 my $self = shift;
89 13         21 my $percentile = shift;
90              
91 13         34 my $n = int(( $percentile / 100 ) * $self->count() + 0.5) - 1;
92 13 100       50 $n = 0 if $n < 0;
93 13         42 return $self->[$n];
94             }
95              
96             sub elapsed {
97 13     13 1 26 my $self = shift;
98              
99 13   100     128 return sum(@$self) || 0;
100             }
101              
102             sub rate {
103 3     3 1 100 my $self = shift;
104              
105 3 100       12 return 0 unless $self->elapsed();
106 2         8 return $self->count() / $self->elapsed();
107             }
108              
109             1;
110              
111             __END__