# # perl file to get a list of files that we load from a timeline log # # Usage: perl getlines.pl < timline.log > file.log # Configuration options # # Set this option to take all timings only upto the main window being visible # All activity beyond main window being visible is ignored. # default is 0. We take timings upto main1 finish $stopWithVisibleWindow = 0; # dlls loaded my @dlls = (); # Files of a particular extensions my %ext = (); # Number of files in a paticular extension. Used to sort them output by order of extension my %extnum = (); # List of all urls that either exist or are jar. Non dups. my @allurls = (); # List of nonexistent file urls my @nonexistentfiles = (); # Number of file urls my $nfileurl = 0; # Number of jar urls my $njarurl = 0; # Urls hash to figure out dups my %seen = (); # Number of dups per extension my %extnumdups = (); # interesting total times my %breakdown = (); # main1 cost my $main1 = 0; # when main window was visible my $window = 0; # pref files loaded my @prefurl = (); while (<>) { chomp; # Computer breakdown of startup cost if (/total:/) { # This is a cumulative timer. Keep track of it. /^[0-9\.: ]*(.*) total: ([0-9\.]*)/; $breakdown{$1} = $2; } if (/InitXPCom\.\.\./) { $breakdown{"Before InitXPCom"} = getTimelineStamp($_); next; } if (/InitXPCOM done/) { $breakdown{"InitXPCom"} = getTimelineStamp($_) - $breakdown{"Before InitXPCom"}; next; } # Find main1's cost to compute percentages if (/\.\.\.main1/) { $main1 = getTimelineStamp($_); } # find when we showed the window if (/Navigator Window visible now/) { $window = getTimelineStamp($_); if ($stopWithVisibleWindow) { $main1 = $window; last; } } # Find all files loaded if (/PR_LoadLibrary/) { my $dll = getdll($_); push @dlls, $dll; next; } if (/file:/) { $url = getfileurl($_); $e = getext($url); if (!-f $url) { push @nonexistentfiles, $url; } else { $seen{$url}++; if ($seen{$url} > 1) { $extnumdups{$e}++; next; } push @allurls, $url; if (exists $ext{$e}) { $ext{$e} .= "---"; } $ext{$e} .= $url; $extnum{$e}++; $nfileurl++; } next; } if (/jar:/) { $url = getjarurl($_); $e = getext($url); $seen{$url}++; if ($seen{$url} > 1) { $extnumdups{$e}++; next; } push @allurls, $url; if (exists $ext{$e}) { $ext{$e} .= "---"; } $ext{$e} .= "$url"; $extnum{$e}++; $njarurl++; next; } if (/load pref file/) { $url = getfile($_); push @prefurl, $url; } } # print results print "SUMMARY\n"; print "----------------------------------------------------------------------\n"; print "Total startup time : $main1 sec\n"; printf "Main window visible: $window sec (%5.2f%%)\n", main1Percent($window); print "dlls loaded : ", $#dlls+1, "\n"; print "Total unique: ", $#allurls+1, " [jar $njarurl, file $nfileurl]\n"; # print the # of files by extensions sorted my @extsorted = sort { $extnum{$b} <=> $extnum{$a} } keys %extnum; my $sep = " "; foreach $i (@extsorted) { print "$sep.$i $extnum{$i}"; $sep = ", "; } print "\n"; # print number of dups per extension my $sep = " dups: "; foreach $i (@extsorted) { next unless exists($extnumdups{$i}); print "$sep.$i $extnumdups{$i}"; $sep = ", "; } print "\n"; print "Total non existent files : ", $#nonexistentfiles+1, "\n"; print "\n"; print "Cost Breakdown\n"; print "----------------------------------------------------------------------\n"; # sort by descending order of breakdown cost my @breakdownsorted = sort { $breakdown{$b} <=> $breakdown{$a} } keys %breakdown; my $totalAccounted = 0; foreach $e (@breakdownsorted) { # ignore these breakdowns as they are already counted otherwise next if ($e =~ /nsNativeComponentLoader::GetFactory/); my $p = main1Percent($breakdown{$e}); #next if ($p == 0); printf "%6.2f%% %s\n", $p, $e; $totalAccounted += $p; } print "----------------------\n"; printf "%6.2f%% Total Accounted\n", $totalAccounted; print "\n"; printf "[%d] List of dlls loaded:\n", $#dlls+1; print "----------------------------------------------------------------------\n"; my $n = 1; foreach $e (@dlls) { printf "%2d. %s\n", $n++, $e; } print "\n"; printf "[%d] List of existing unique files and jar urls by extension:\n", $#allurls+1; print "----------------------------------------------------------------------\n"; foreach $e (@extsorted) { $n = 1; print "[$extnum{$e}] .$e\n"; foreach $i (split("---", $ext{$e})) { printf "%2d. %s", $n++, $i; if ($seen{$i} > 1) { printf " [%d]", $seen{$i}-1; } printf "\n"; } print "\n"; } #foreach $i (@allurls) #{ # printf "%2d. %s\n", $n++, $i; #} print "\n"; printf "[%d] List of non existent file urls:\n", $#nonexistentfiles+1; print "----------------------------------------------------------------------\n"; my $n = 1; foreach $i (@nonexistentfiles) { printf "%2d. %s\n", $n++, $i; } # print prefs loaded print "\n"; printf "[%d] List of pref files loaded:\n", $#prefurl+1; print "----------------------------------------------------------------------\n"; $n = 1; foreach $i (@prefurl) { printf "%2d. %s\n", $n++, $i; } # Subrouties sub getTimelineStamp() { my $line = shift; $line =~ /^([0-9\.]*)/; return $1+0; } sub getfileurl() { my $f = shift; $f =~ s/^.*file:\/*(.*)\).*$/\1/; # unescape the url $f =~ s/\|/:/; $f =~ s/\%20/ /g; return $f; } sub getjarurl() { my $f = shift; $f =~ s/^.*(jar:.*)\).*$/\1/; return $f; } sub getdll() { my $f = shift; $f =~ s/^.*\((.*)\).*$/\1/; return $f; } sub getext() { my $f = shift; $f =~ s/^.*\.([^\.]*)$/\1/; return $f; } sub getfile() { my $f = shift; $f =~ s/^.*\((.*)\)$/\1/; return $f; } # what % is this of startup sub main1Percent() { my $i = shift; return $i/$main1 * 100; }