File Coverage

File:lib/App/plackbench/Stats.pm
Coverage:100.0%

linestmtbrancondsubtimecode
1package App::plackbench::Stats;
2
3
6
6
6
32
13
226
use strict;
4
6
6
6
34
12
176
use warnings;
5
6
6
6
293
16909
37
use autodie;
6
6
6
6
29508
39
319
use v5.10;
7
8
6
6
6
36
13
4988
use List::Util qw( sum reduce );
9
10sub new {
11
28
72
    my $class = shift;
12
28
71
97
152
    my @self = sort { $a <=> $b } @_;
13
28
221
    return bless \@self, $class;
14}
15
16sub insert {
17
44
101
    my $self = shift;
18
44
81
    my $n = shift;
19
20
44
118
    my $index = $self->count();
21
22
44
127
    for (my $i = 0; $i < $self->count(); $i++) {
23
74
242
        if ($n < $self->[$i]) {
24
33
62
            $index = $i;
25
33
74
            last;
26        }
27    }
28
29
44
44
90
123
    splice(@{$self}, $index, 0, $n);
30
31
44
117
    return $index;
32}
33
34sub count {
35
188
357
    my $self = shift;
36
188
188
350
633
    return scalar @{$self};
37}
38
39sub mean {
40
7
16
    my $self = shift;
41
42
7
19
    return unless $self->count();
43
6
6
15
43
    return sum(@{$self}) / $self->count();
44}
45
46sub median {
47
5
12
    my $self = shift;
48
49
5
14
    return unless $self->count();
50
51
4
10
    if ($self->count() % 2 == 1) {
52
2
5
        return $self->[$self->count() / 2];
53    }
54
55
2
6
    my $index_a = ($self->count() / 2) + 0.5;
56
2
5
    my $index_b = ($self->count() / 2) - 0.5;
57
2
6
    my $a = $self->[$index_a];
58
2
6
    my $b = $self->[$index_b];
59
2
8
    return ($a + $b) / 2;
60}
61
62sub min {
63
4
9
    my $self = shift;
64
65
4
11
    return unless $self->count();
66
3
16
    return $self->[0];
67}
68
69sub max {
70
4
9
    my $self = shift;
71
4
11
    return unless $self->count();
72
3
30
    return $self->[-1];
73}
74
75sub standard_deviation {
76
3
6
    my $self = shift;
77
78
3
9
    return 0 unless $self->count();
79
2
7
    my $mean = $self->mean();
80
81    my $differences_sum = reduce {
82
18
46
        $a + ( ( $b - $mean )**2 );
83    }
84
2
2
14
37
    0, @{$self};
85
86
2
11
    my $sd = sqrt( $differences_sum / $self->count() );
87
2
8
    return $sd;
88}
89
90sub percentile {
91
13
29
    my $self = shift;
92
13
30
    my $percentile = shift;
93
94
13
32
    my $n = int(( $percentile / 100 ) * $self->count() + 0.5) - 1;
95
13
41
    $n = 0 if $n < 0;
96
13
43
    return $self->[$n];
97}
98
991;
100