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   13084 use strict;
  1         3  
  1         44  
4 1     1   6 use base 'Exporter';
  1         3  
  1         777  
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 25 my($n, $d, $u) = @_;
25 20 50       28 $u = "" unless defined $u;
26              
27 20 100       23 my $dev = defined($d) ? 1 : "";
28 20 100       24 $d = $n unless $dev;
29 20         20 $d = abs($d);
30              
31 20         17 my $p = 0;
32 20 100       33 if ($d < 0.05) {
    100          
    100          
33 2         2 $p = 3;
34             }
35             elsif ($d < 0.5) {
36 2         3 $p = 2;
37             }
38             elsif ($d < 5) {
39 7         8 $p = 1;
40             }
41              
42 20 100       33 $dev = sprintf(" ±%.*f", $p, $d) if $dev;
43 20         74 return sprintf("%.*f%s%s", $p, $n, $u, $dev);
44             }
45              
46             sub sec_f {
47 20     20 0 128919 my($t, $d, $u) = @_;
48 20         20 my $f;
49 20 100       25 if (defined $u) {
50 3   33     25 $f = $TIME_UNITS{$u} || croak("Unknown unit '$u'");
51             }
52             else {
53 17         25 for (my $i = 1; $i < @TIME_UNITS; $i++) {
54 49 100       81 if ($t < 1/$TIME_UNITS[$i][1]) {
55 16         11 ($u, $f) = @{$TIME_UNITS[$i-1]};
  16         22  
56 16         17 last;
57             }
58             }
59 17 100       23 unless ($u) {
60 1         2 ($u, $f) = @{$TIME_UNITS[-1]};
  1         3  
61             }
62             }
63              
64 20 100       33 if ($f != 1) {
65 13         12 $t *= $f;
66 13 100       18 $d *= $f if defined $d;
67             }
68              
69 20         29 return num_f($t, $d, " $u");
70             }
71              
72             1;