File Coverage

blib/lib/Perf/Stopwatch.pm
Criterion Covered Total %
statement 43 46 93.4
branch 13 16 81.2
condition 1 3 33.3
subroutine 11 13 84.6
pod 10 10 100.0
total 78 88 88.6


line stmt bran cond sub pod time code
1             package Perf::Stopwatch;
2             require Exporter;
3              
4 3     3   97393 use strict;
  3         6  
  3         123  
5 3     3   16 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  3         7  
  3         279  
6 3     3   3142 use Time::HiRes qw(gettimeofday tv_interval);
  3         6587  
  3         14  
7              
8             $VERSION = '0.10';
9             @ISA = qw(Exporter);
10             @EXPORT = qw();
11             @EXPORT_OK = qw(start stop lap clear getTime getLaps getMinLap getMaxLap);
12             %EXPORT_TAGS = (
13             normal => [qw(start stop getTime)],
14             burst => [qw(start stop clear getTime)],
15             lap => [qw(start stop lap getTime getLaps getMinLap getMaxLap)],
16             all => [qw(start stop lap clear getTime getLaps getMinLap getMaxLap)]
17             );
18              
19             sub new {
20 3     3 1 2113 my $inv = shift;
21 3   33     25 my $cls = ref($inv) || $inv;
22              
23             # Possible $types are: normal, lap, burst
24 3         24 my $obj = {
25             type => "normal",
26             laps => 100,
27             c_lap => 0,
28             final => 0,
29             @_
30             };
31              
32             # convert common string to efficient number comparison
33 3 100       24 if( $obj->{type} eq "normal" ){
    100          
    50          
34 1         5 $obj->{type} = 0;
35             } elsif( $obj->{type} eq "lap" ){
36 1         3 $obj->{type} = 1;
37             } elsif( $obj->{type} eq "burst" ){
38 1         3 $obj->{type} = 2;
39             }
40 3 100       21 $obj->{lap}[$obj->{laps}-1] = undef if( $obj->{type} == 1 );
41              
42 3         15 return bless $obj, $cls;
43             }
44              
45             sub start {
46 102     102 1 8933 shift->{t_beg} = [gettimeofday];
47             }
48              
49             sub stop {
50 101     101 1 1004330 my $self = shift;
51 101         335 $self->{t_end} = [gettimeofday];
52              
53 101 100       260 if( $self->{type} == 2 ){
    50          
    50          
54 100         280 $self->{final} += tv_interval( $self->{t_beg}, $self->{t_end} );
55             } elsif( $self->{type} == 1 ){
56 0         0 $self->{lap}[$self->{c_lap}++] = tv_interval( $self->{t_beg}, $self->{t_end} );
57             } elsif( $self->{type} == 0 ){
58 1         13 $self->{final} = tv_interval( $self->{t_beg}, $self->{t_end} );
59             }
60             }
61              
62             sub lap {
63 200     200 1 3898 my $self = shift;
64 200         507 $self->{t_end} = [gettimeofday];
65 200         504 $self->{lap}[$self->{c_lap}++] = tv_interval( $self->{t_beg}, $self->{t_end} );
66 200         2010 $self->{t_beg} = [gettimeofday];
67             }
68              
69             sub clear {
70 0     0 1 0 shift->{final} = 0;
71             }
72              
73             sub getTime {
74 3     3 1 60 my $self = shift;
75              
76 3 100       31 if( $self->{type} == 1 ){
77 1         2 $self->{final} = 0;
78 1         2 $self->{final} += $_ foreach( @{$self->{lap}} );
  1         54  
79             }
80 3         43 return $self->{final};
81             }
82              
83             sub numLaps {
84 0     0 1 0 return shift->{c_lap};
85             }
86              
87             sub getLaps {
88 1     1 1 7 return shift->{lap};
89             }
90              
91             sub getMaxLap {
92 1     1 1 6 my @t = reverse sort { $a <=> $b } @{shift->{lap}};
  1166         1009  
  1         4  
93 1         8 return $t[0];
94             }
95              
96             sub getMinLap {
97 1     1 1 5 my @t = sort { $a <=> $b } @{shift->{lap}};
  1166         1074  
  1         8  
98 1         8 return $t[0];
99             }
100              
101             1;
102             __END__