X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=scripts%2Funpickle.py;h=50d8480aac948143f78c091bb5198d2a04ec4773;hb=7a9fb5103e052150232b64cb5d99374cda3f1234;hp=ab2dc4db0311292dce0a0a8ab23474cdc3d9b300;hpb=97ac28e65ca20b5649552597afaeee1d67766f6a;p=apitrace diff --git a/scripts/unpickle.py b/scripts/unpickle.py index ab2dc4d..50d8480 100755 --- a/scripts/unpickle.py +++ b/scripts/unpickle.py @@ -152,7 +152,7 @@ class Rebuilder(Visitor): newItems.append(newItem) if changed: klass = type(obj) - return klass(changed) + return klass(newItems) else: return obj @@ -218,25 +218,42 @@ class Unpickler: class Counter(Unpickler): - def __init__(self, stream, quiet): + def __init__(self, stream, verbose = False): Unpickler.__init__(self, stream) - self.quiet = quiet - self.calls = 0 + self.verbose = verbose + self.numCalls = 0 + self.functionFrequencies = {} + + def parse(self): + Unpickler.parse(self) + + functionFrequencies = self.functionFrequencies.items() + functionFrequencies.sort(lambda (name1, freq1), (name2, freq2): cmp(freq1, freq2)) + for name, frequency in functionFrequencies: + sys.stdout.write('%8u %s\n' % (frequency, name)) def handleCall(self, call): - if not self.quiet: + if self.verbose: sys.stdout.write(str(call)) sys.stdout.write('\n') - self.calls += 1 + self.numCalls += 1 + try: + self.functionFrequencies[call.functionName] += 1 + except KeyError: + self.functionFrequencies[call.functionName] = 1 def main(): optparser = optparse.OptionParser( - usage="\n\tapitrace pickle trace. %prog [options]") + usage="\n\tapitrace pickle | %prog [options]") + optparser.add_option( + '-p', '--profile', + action="store_true", dest="profile", default=False, + help="profile call parsing") optparser.add_option( - '-q', '--quiet', - action="store_true", dest="quiet", default=False, - help="don't dump calls to stdout") + '-v', '--verbose', + action="store_true", dest="verbose", default=False, + help="dump calls to stdout") (options, args) = optparser.parse_args(sys.argv[1:]) @@ -253,11 +270,13 @@ def main(): msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) startTime = time.time() - parser = Counter(sys.stdin, options.quiet) + parser = Counter(sys.stdin, options.verbose) parser.parse() stopTime = time.time() duration = stopTime - startTime - sys.stderr.write('%u calls, %.03f secs, %u calls/sec\n' % (parser.calls, duration, parser.calls/duration)) + + if options.profile: + sys.stderr.write('Processed %u calls in %.03f secs, at %u calls/sec\n' % (parser.numCalls, duration, parser.numCalls/duration)) if __name__ == '__main__':