Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 1 | import W |
Jack Jansen | 5a6fdcd | 2001-08-25 12:15:04 +0000 | [diff] [blame] | 2 | from Carbon import Evt |
Jack Jansen | fd0b00e | 2003-01-26 22:15:48 +0000 | [diff] [blame] | 3 | import EasyDialogs |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 4 | |
| 5 | import sys |
| 6 | import StringIO |
| 7 | import string |
| 8 | import pstats, fpformat |
| 9 | |
| 10 | # increase precision |
| 11 | def f8(x): |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 12 | return string.rjust(fpformat.fix(x, 4), 8) |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 13 | pstats.f8 = f8 |
| 14 | |
| 15 | # hacking around a hack |
| 16 | if sys.version[:3] > '1.4': |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 17 | timer = Evt.TickCount |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 18 | else: |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 19 | def timer(TickCount = Evt.TickCount): |
| 20 | return TickCount() / 60.0 |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 21 | |
| 22 | class ProfileBrowser: |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 23 | |
| 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 Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 77 | |
| 78 | |
| 79 | def main(): |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 80 | 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 Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 90 | |
| 91 | if __name__ == '__main__': |
Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 92 | main() |