File Coverage

blib/lib/PerlBench/Utils.pm
Criterion Covered Total %
statement 34 34 100.0
branch 23 24 95.8
condition 1 3 33.3
subroutine 4 4 100.0
pod 0 2 0.0
total 62 67 92.5


line stmt bran cond sub pod time code
1             package PerlBench::Utils;
2              
3 1     1   3565 use strict;
  1         2  
  1         25  
4 1     1   4 use base 'Exporter';
  1         2  
  1         362  
5             our @EXPORT_OK = qw(sec_f num_f);
6              
7             our $VERSION = "1.001";
8              
9             my %TIME_UNITS = (
10             "h" => 1/3600,
11             "min" => 1/60,
12             "s" => 1,
13             "ms" => 1e3,
14             "µs" => 1e6,
15             "ns" => 1e9,
16             );
17              
18             my @TIME_UNITS =
19             sort { $b->[1] <=> $a->[1] }
20             map { [$_ => $TIME_UNITS{$_}] }
21             keys %TIME_UNITS;
22              
23             sub num_f {
24 20     20 0 35 my($n, $d, $u) = @_;
25 20 50       37 $u = "" unless defined $u;
26              
27 20 100       37 my $dev = defined($d) ? 1 : "";
28 20 100       44 $d = $n unless $dev;
29 20         28 $d = abs($d);
30              
31 20         28 my $p = 0;
32 20 100       50 if ($d < 0.05) {
    100          
    100          
33 2         4 $p = 3;
34             }
35             elsif ($d < 0.5) {
36 2         3 $p = 2;
37             }
38             elsif ($d < 5) {
39 7         14 $p = 1;
40             }
41              
42 20 100       48 $dev = sprintf(" ±%.*f", $p, $d) if $dev;
43 20         125 return sprintf("%.*f%s%s", $p, $n, $u, $dev);
44             }
45              
46             sub sec_f {
47 20     20 0 431 my($t, $d, $u) = @_;
48 20         32 my $f;
49 20 100       33 if (defined $u) {
50 3   33     9 $f = $TIME_UNITS{$u} || croak("Unknown unit '$u'");
51             }
52             else {
53 17         44 for (my $i = 1; $i < @TIME_UNITS; $i++) {
54 49 100       127 if ($t < 1/$TIME_UNITS[$i][1]) {
55 16         20 ($u, $f) = @{$TIME_UNITS[$i-1]};
  16         31  
56 16         28 last;
57             }
58             }
59 17 100       35 unless ($u) {
60 1         2 ($u, $f) = @{$TIME_UNITS[-1]};
  1         3  
61             }
62             }
63              
64 20 100       42 if ($f != 1) {
65 13         19 $t *= $f;
66 13 100       27 $d *= $f if defined $d;
67             }
68              
69 20         55 return num_f($t, $d, " $u");
70             }
71              
72             1;