| #!/usr/bin/perl |
| sub error { |
| print("Error: @_\n"); |
| exit(1); |
| } |
| sub usage { |
| if (@_) { |
| print STDERR ("Error: @_\n"); |
| } |
| print STDERR ("USAGE:\n"); |
| print STDERR ("$0 file1 file2 [showcalldiff]\n"); |
| print STDERR |
| ("\tfile[12] output from profile_reader.pl to compare\n"); |
| print STDERR |
| ("\tshowcalldiff show the percent change in calls instead of ticks\n"); |
| exit(1); |
| } |
| if ($ARGV[0] =~ m/-(h|help|-help)/) { |
| usage(); |
| } |
| if (@ARGV < 2) { |
| usage("Requires at least 2 arguments"); |
| } |
| open(FILE1,shift) || error("Couldn't open file1"); |
| my @file1 = <FILE1>; |
| close(FILE1); |
| open(FILE2,shift) || error("Couldn't open file2"); |
| my @file2 = <FILE2>; |
| close(FILE2); |
| my $showcalldiff = shift; |
| my %calls1; |
| my %calls2; |
| my @calls = (\%calls1,\%calls2); |
| my $start = 0; |
| my @files = (\@file1,\@file2); |
| my @allcalls = (0,0); |
| my @allticks = (0,0); |
| for ( $i=0; $i <= $#files; $i++ ) { |
| my $file = $files[$i]; |
| foreach $line(@$file) { |
| chomp($line); |
| if ( $line =~ m/By calls/ ) { |
| $start = 1; |
| next; |
| } |
| if ( $line =~ m/By ticks/ ) { |
| $start = 0; |
| last; |
| } |
| if ( $start == 1) { |
| my @line = split(/[[:space:]]+/,$line); |
| $allcalls[$i] += $line[1]; |
| $allticks[$i] += $line[3]; |
| $calls[$i]{$line[5]} = [($line[1],$line[3])]; |
| } |
| } |
| } |
| printf("File one calls: %08ld, ticks: %08ld\n",$allcalls[0],$allticks[0]); |
| printf("File two calls: %08ld, ticks: %08ld\n",$allcalls[1],$allticks[1]); |
| printf("Percent change: %+7.2f%%, ticks: %+7.2f%%\n", |
| ($allcalls[1]-$allcalls[0])/$allcalls[0]*100, |
| ($allticks[1]-$allticks[0])/$allticks[0]*100); |
| my @allkeys = keys(%calls1); |
| push(@allkeys,keys(%calls2)); |
| my %u = (); |
| my @keys = grep {defined} map { |
| if (exists $u{$_}) { undef; } else { $u{$_}=undef;$_; } |
| } @allkeys; |
| undef %u; |
| my %byticks; |
| my %bycalls; |
| foreach $key(@keys) { |
| my $values1 = $calls1{$key}; |
| my $values2 = $calls2{$key}; |
| my $calldiff = @$values2[0]-@$values1[0]; |
| my $totalcalls = @$values2[0]+@$values1[0]; |
| my $tickdiff = @$values2[1]-@$values1[1]; |
| my $totalticks = @$values2[1]+@$values1[1]; |
| my $pdiff; |
| my $result; |
| if ($showcalldiff) { |
| $pdiff = $calldiff/(@$values1[0]>0?@$values1[0]:1)*100; |
| $result = sprintf("%+7.2f%% Calls: %+09d Symbol: %s$key\n", |
| $pdiff, $calldiff, |
| (exists $calls1{$key} && exists $calls2{$key})?"":"LONE "); |
| } else { |
| $pdiff = $tickdiff/(@$values1[1]>0?@$values1[1]:1)*100; |
| $result = sprintf("%+7.2f%% Ticks: %+09d Symbol: %s$key\n", |
| $pdiff, $tickdiff, |
| (exists $calls1{$key} && exists $calls2{$key})?"":"LONE "); |
| } |
| $bycalls{sprintf("%08X$key",$totalcalls)} = $result; |
| $byticks{sprintf("%08X$key",$totalticks)} = $result; |
| } |
| my @calls = sort(keys(%bycalls)); |
| print("By calls\n"); |
| foreach $call(@calls) { |
| print($bycalls{$call}); |
| } |
| my @ticks = sort(keys(%byticks)); |
| print("By ticks\n"); |
| foreach $tick(@ticks) { |
| print($byticks{$tick}); |
| } |