7 print STDERR "Usage: $pname <stats_file> [<interval>]\n";
15 if (($#ARGV < 0) || ($#ARGV > 1)) {
18 $statspath = $ARGV[0];
35 my $itc_freq; # On Itanium systems use this
36 if (open(CPUINFO, "/proc/cpuinfo")==0) {
40 if (/^cpu MHz\s+:\s*([\d\.]+)/) { $cpu_freq=$1; }
41 elsif (/^itc MHz\s+:\s*([\d\.]+)/) { $itc_freq=$1; }
43 if (defined($itc_freq)) { $mhz = $itc_freq; }
44 elsif (defined($cpu_freq)) { $mhz = $cpu_freq; }
49 print "Processor counters run at $mhz MHz\n";
53 open(STATS, $statspath) || die "Cannot open $statspath: $!\n";
56 ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare)
59 $prevcount = %cumulhash->{$name};
60 if (defined($prevcount)) {
61 $diff = $cumulcount - $prevcount;
62 if ($name eq "snapshot_time") {
64 # printf "%-25s prev=$prevcount, cumul=$cumulcount diff=$diff, tdiff=$tdiff\n", $name;
65 printf "$statspath @ $cumulcount\n";
66 printf "%-25s %-10s %-10s %-10s", "Name", "Cur.Count", "Cur.Rate", "#Events";
68 printf "%-8s %10s %10s %12s %10s", "Unit", "last", "min", "avg", "max";
71 printf "%10s", "stddev";
76 elsif ($cumulcount!=0) {
77 printf "%-25s %-10lu %-10lu %-10lu",
78 $name, $diff, ($diff/$tdiff), $cumulcount;
82 my $sum_diff = $sum - %sumhash->{$name};
84 #printf "\n%-25s diff=$diff, sum=$sum sumhash=%10s sum_diff=$sum_diff\n", $name, %sumhash->{$name};
86 $diff = 1; # avoid division by zero
88 if (($unit eq "[cycles]") && ($mhz != 1)) {
92 $sum_diff = $sum_diff/$mhz;
95 printf "%-8s %10.2f %10lu %12.2f %10lu", $unit, ($sum_diff/$diff), $min,($sum/$cumulcount),$max;
96 if (defined($sumsquare)) {
97 my $s = $sumsquare - (($sum_orig*$sum_orig)/$cumulcount);
99 my $cnt = ($cumulcount >= 2) ? $cumulcount : 2 ;
100 my $stddev = sqrt($s/($cnt - 1));
101 if (($unit eq "[usecs]") && ($mhz != 1)) {
102 $stddev = $stddev/$mhz;
104 printf " %10.2f", $stddev;
113 if ($cumulcount!=0) {
114 printf "%-25s $cumulcount\n", $name
119 if (defined($sumsquare)) {
123 %cumulhash->{$name} = $cumulcount;
124 %sumhash->{$name} = $sum;