forked from len0rd/rockbox
Profiling support, tools and documentation.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8375 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
1060e447f8
commit
05dccc3551
33 changed files with 992 additions and 18 deletions
104
tools/profile_reader/profile_comparator.pl
Executable file
104
tools/profile_reader/profile_comparator.pl
Executable file
|
|
@ -0,0 +1,104 @@
|
|||
#!/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});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue