/[thuban]/branches/WIP-pyshapelib-bramz/Extensions/profiling/profiling.py
ViewVC logotype

Annotation of /branches/WIP-pyshapelib-bramz/Extensions/profiling/profiling.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2734 - (hide annotations)
Thu Mar 1 12:42:59 2007 UTC (18 years ago) by bramz
File MIME type: text/x-python
File size: 4180 byte(s)
made a copy
1 jan 2391 # Copyright (C) 2003, 2004 by Intevation GmbH
2 bh 1896 # Authors:
3 jan 2391 # Bernhard Herzog <[email protected]> (2003)
4     # Jan-Oliver Wagner <[email protected]> (2003, 2004)
5 bh 1896 #
6     # This program is free software under the GPL (>=v2)
7     # Read the file COPYING coming with the software for details.
8    
9     """Performance Measurement
10    
11     This module implements two Thuban commands in a new Profiling menu:
12    
13     Profile Screen Render -- Run the screen rendering code in a profile
14    
15     Time Screen Render -- Measure the time taken for a complete redraw
16    
17     See the individual functions for more details.
18     """
19    
20     __version__ = "$Revision$"
21     # $Source$
22     # $Id$
23    
24     import os
25 jan 1901 import StringIO
26     import sys
27 bh 1896 import tempfile
28     import profile
29     import time
30 jan 1901 import pstats
31 bh 1896
32 dpinte 2721 from wx.lib.dialogs import ScrolledMessageDialog
33 jan 1901
34     from Thuban import _
35 bh 1896 from Thuban.UI.command import registry, Command
36 jan 2203 from Thuban.UI.mainwindow import main_menu
37 bh 1896
38     #
39     # Customization
40     #
41     # Assign to these in your ~/.thuban/thubanstart
42    
43     # The machine specific profiler bias. See the standard python profile
44     # module for details on how to find out which value to use.
45     profiler_bias = 0
46    
47     # The directory the profile output is to be written to
48     # (Call mktemp once to initialize tempfile.tempdir)
49     tempfile.mktemp()
50     profile_dir = tempfile.tempdir
51    
52 bh 1915 # Wether to pop up a dialog box with the result.
53     popup_dialog_box = True
54 bh 1896
55 bh 1915
56 bh 1896 #
57     # Timing and profiling a complete redraw
58     #
59    
60     def do_redraw(context):
61     """Perform a complete redraw in the canvas in context"""
62     canvas = context.mainwindow.canvas
63    
64     # Make sure there are no no finished bitmaps and active renderer
65     canvas.full_redraw()
66    
67     # Iterate until all is drawn
68     for c in canvas._render_iterator():
69     pass
70    
71    
72     #
73     # Profiling the redraw
74     #
75    
76    
77     def profile_screen_renderer(context):
78     """Script to run the redraw in the profiler
79    
80     The data gathered by the profiler will be written to
81     <TMPDIR>/thuban-render.profile (<TMPDIR> is your system specific
82     temporary directory.
83    
84     See the python documentation of the profile and pstats modules for
85     how to access the data in the generated .profile file.
86     """
87     print "profiling screen renderer...",
88 bh 1915 sys.stdout.flush()
89 bh 1896 prof = profile.Profile(bias = profiler_bias)
90     prof.runctx("do_redraw(context)", globals(), locals())
91     filename = os.path.join(profile_dir, "thuban-render.profile")
92     prof.dump_stats(filename)
93     print "done and saved to", filename
94    
95 bh 1915 if popup_dialog_box:
96     # catch the printout to stdout so that we can present the
97     # text in a dialog
98     f = StringIO.StringIO()
99     orig_stdout = sys.stdout
100     sys.stdout = f
101     try:
102     p = pstats.Stats(filename)
103     msg = _('These are the statistics sorted by cumulative time:')
104     p.strip_dirs().sort_stats('cumulative').print_stats()
105     m = f.getvalue()
106     msg = '%s\n\n%s' % (msg, m)
107     finally:
108     sys.stdout = orig_stdout
109 bh 1896
110 dpinte 2721 dlg = ScrolledMessageDialog(context.mainwindow, msg,
111 bh 1915 _('Profile Screen Render'))
112     dlg.ShowModal()
113 jan 1901
114    
115     registry.Add(Command("profile_screen_renderer", _('Profile Screen Render'),
116 bh 1896 profile_screen_renderer,
117 jan 1901 helptext = _('Profile the screen render')))
118 bh 1896
119    
120     #
121     # Timing the redraw
122     #
123    
124     def time_screen_renderer(context):
125     """Script to measure the time of a complete redraw.
126    
127     The time taken will be printed to stdout.
128     """
129     start = time.clock()
130     do_redraw(context)
131 jan 1901 duration = time.clock() - start
132     msg = _('Redraw finished in %g seconds.') % duration
133 bh 1915 if popup_dialog_box:
134     context.mainwindow.RunMessageBox(_('Time Screen Render'), msg)
135     else:
136     print msg
137 bh 1896
138    
139 jan 1901 registry.Add(Command("time_screen_renderer", _('Time Screen Render'),
140 bh 1896 time_screen_renderer,
141 jan 1901 helptext = _('Time the screen render')))
142 bh 1896
143 jan 1901 # find the extensions menu (create it anew if not found)
144 jan 2203 extensions_menu = main_menu.FindOrInsertMenu('extensions', _('E&xtensions'))
145 jan 1901
146     profiler_menu = extensions_menu.InsertMenu("profiler", _('&Profiler'))
147     profiler_menu.InsertItem("time_screen_renderer")
148     profiler_menu.InsertItem("profile_screen_renderer")

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26