blob: a2dafddfe17269d0d6accc4db7fbb696bb781e7c [file] [log] [blame]
Just van Rossum40f9b7b1999-01-30 22:39:17 +00001import W
Jack Jansen5a6fdcd2001-08-25 12:15:04 +00002from Carbon import Evt
Jack Jansenfd0b00e2003-01-26 22:15:48 +00003import EasyDialogs
Just van Rossum40f9b7b1999-01-30 22:39:17 +00004
5import sys
6import StringIO
7import string
8import pstats, fpformat
9
10# increase precision
11def f8(x):
Tim Peters182b5ac2004-07-18 06:16:08 +000012 return string.rjust(fpformat.fix(x, 4), 8)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000013pstats.f8 = f8
14
15# hacking around a hack
16if sys.version[:3] > '1.4':
Tim Peters182b5ac2004-07-18 06:16:08 +000017 timer = Evt.TickCount
Just van Rossum40f9b7b1999-01-30 22:39:17 +000018else:
Tim Peters182b5ac2004-07-18 06:16:08 +000019 def timer(TickCount = Evt.TickCount):
20 return TickCount() / 60.0
Just van Rossum40f9b7b1999-01-30 22:39:17 +000021
22class ProfileBrowser:
Tim Peters182b5ac2004-07-18 06:16:08 +000023
24 def __init__(self, stats = None):
25 self.sortkeys = ('calls',)
26 self.setupwidgets()
27 self.setstats(stats)
28
29 def setupwidgets(self):
30 self.w = W.Window((580, 400), "Profile Statistics", minsize = (200, 100), tabbable = 0)
31 self.w.divline = W.HorizontalLine((0, 20, 0, 0))
32 self.w.titlebar = W.TextBox((4, 4, 40, 12), 'Sort by:')
33 self.buttons = []
34 x = 54
35 width1 = 50
36 width2 = 75
37 for name in ["calls", "time", "cumulative", "stdname", "file", "line", "name"]:
38 if len(name) > 6:
39 width = width2
40 else:
41 width = width1
42 self.w["button_" + name] = W.RadioButton((x, 4, width, 12), name, self.buttons, self.setsort)
43 x += width + 10
44 self.w.button_calls.set(1)
45 self.w.text = W.TextEditor((0, 21, -15, -15), inset = (6, 5),
46 readonly = 1, wrap = 0, fontsettings = ('Monaco', 0, 9, (0, 0, 0)))
47 self.w._bary = W.Scrollbar((-15, 20, 16, -14), self.w.text.vscroll, max = 32767)
48 self.w._barx = W.Scrollbar((-1, -15, -14, 16), self.w.text.hscroll, max = 32767)
49 self.w.open()
50
51 def setstats(self, stats):
52 self.stats = stats
53 self.stats.strip_dirs()
54 self.displaystats()
55
56 def setsort(self):
57 # Grmpf. The callback doesn't give us the button:-(
58 for b in self.buttons:
59 if b.get():
60 if b._title == self.sortkeys[0]:
61 return
62 self.sortkeys = (b._title,) + self.sortkeys[:3]
63 break
64 self.displaystats()
65
66 def displaystats(self):
67 W.SetCursor('watch')
68 apply(self.stats.sort_stats, self.sortkeys)
69 saveout = sys.stdout
70 try:
71 s = sys.stdout = StringIO.StringIO()
72 self.stats.print_stats()
73 finally:
74 sys.stdout = saveout
75 text = string.join(string.split(s.getvalue(), '\n'), '\r')
76 self.w.text.set(text)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000077
78
79def main():
Tim Peters182b5ac2004-07-18 06:16:08 +000080 import pstats
81 args = sys.argv[1:]
82 for i in args:
83 stats = pstats.Stats(i)
84 browser = ProfileBrowser(stats)
85 else:
86 filename = EasyDialogs.AskFileForOpen(message='Profiler data')
87 if not filename: sys.exit(0)
88 stats = pstats.Stats(filename)
89 browser = ProfileBrowser(stats)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000090
91if __name__ == '__main__':
Tim Peters182b5ac2004-07-18 06:16:08 +000092 main()