ProfileBrowser.py 2.31 KB
Newer Older
Just van Rossum's avatar
Just van Rossum committed
1
import W
2
from Carbon import Evt
Just van Rossum's avatar
Just van Rossum committed
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

import sys
import StringIO
import string
import pstats, fpformat

# increase precision
def f8(x):
	return string.rjust(fpformat.fix(x, 4), 8)
pstats.f8 = f8

# hacking around a hack
if sys.version[:3] > '1.4':
	timer = Evt.TickCount
else:
	def timer(TickCount = Evt.TickCount):
		return TickCount() / 60.0

class ProfileBrowser:
	
	def __init__(self, stats = None):
		self.sortkeys = ('calls',)
		self.setupwidgets()
		self.setstats(stats)
	
	def setupwidgets(self): 
		self.w = W.Window((580, 400), "Profile Statistics", minsize = (200, 100), tabbable = 0)
		self.w.divline = W.HorizontalLine((0, 20, 0, 0))
		self.w.titlebar = W.TextBox((4, 4, 40, 12), 'Sort by:')
		self.buttons = []
33 34 35 36 37 38 39 40 41 42
		x = 54
		width1 = 50
		width2 = 75
		for name in ["calls", "time", "cumulative", "stdname", "file", "line", "name"]:
			if len(name) > 6:
				width = width2
			else:
				width = width1
			self.w["button_" + name] = W.RadioButton((x, 4, width, 12), name, self.buttons, self.setsort)
			x += width + 10
Just van Rossum's avatar
Just van Rossum committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
		self.w.button_calls.set(1)
		self.w.text = W.TextEditor((0, 21, -15, -15), inset = (6, 5), 
				readonly = 1, wrap = 0, fontsettings = ('Monaco', 0, 9, (0, 0, 0)))
		self.w._bary = W.Scrollbar((-15, 20, 16, -14), self.w.text.vscroll, max = 32767)
		self.w._barx = W.Scrollbar((-1, -15, -14, 16), self.w.text.hscroll, max = 32767)
		self.w.open()
	
	def setstats(self, stats):
		self.stats = stats
		self.stats.strip_dirs()
		self.displaystats()
	
	def setsort(self):
		# Grmpf. The callback doesn't give us the button:-(
		for b in self.buttons:
			if b.get():
				if b._title == self.sortkeys[0]:
					return
				self.sortkeys = (b._title,) + self.sortkeys[:3]
				break
		self.displaystats()
	
	def displaystats(self):
		W.SetCursor('watch')
		apply(self.stats.sort_stats, self.sortkeys)
		saveout = sys.stdout
		try:
			s = sys.stdout = StringIO.StringIO()
			self.stats.print_stats()
		finally:
			sys.stdout = saveout
		text = string.join(string.split(s.getvalue(), '\n'), '\r')
		self.w.text.set(text)


def main():
	import pstats
	args = sys.argv[1:]
	for i in args:
		stats = pstats.Stats(i)
		browser = ProfileBrowser(stats)
	else:
		import macfs
		fss, ok = macfs.PromptGetFile('Profiler data')
		if not ok: sys.exit(0)
		stats = pstats.Stats(fss.as_pathname())
		browser = ProfileBrowser(stats)

if __name__ == '__main__':
	main()