Mercurial > piecrust2
comparison piecrust/environment.py @ 687:61d606fbc313
bake: Change `show-timers` to `show-stats`, add stats.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Mon, 14 Mar 2016 08:26:14 -0700 |
parents | 81d9c3a3a0b5 |
children | 4850f8c21b6e |
comparison
equal
deleted
inserted
replaced
686:1a6c4c2683fd | 687:61d606fbc313 |
---|---|
50 | 50 |
51 def clear(self): | 51 def clear(self): |
52 self._page_stack = [] | 52 self._page_stack = [] |
53 | 53 |
54 | 54 |
55 class ExecutionStats(object): | |
56 def __init__(self): | |
57 self.timers = {} | |
58 self.counters = {} | |
59 self.manifests = {} | |
60 | |
61 def registerTimer(self, category, *, raise_if_registered=True): | |
62 if raise_if_registered and category in self.timers: | |
63 raise Exception("Timer '%s' has already been registered." % | |
64 category) | |
65 self.timers[category] = 0 | |
66 | |
67 @contextlib.contextmanager | |
68 def timerScope(self, category): | |
69 start = time.perf_counter() | |
70 yield | |
71 self.timers[category] += time.perf_counter() - start | |
72 | |
73 def stepTimer(self, category, value): | |
74 self.timers[category] += value | |
75 | |
76 def stepTimerSince(self, category, since): | |
77 self.stepTimer(category, time.perf_counter() - since) | |
78 | |
79 def registerCounter(self, category, *, raise_if_registered=True): | |
80 if raise_if_registered and category in self.counters: | |
81 raise Exception("Counter '%s' has already been registered." % | |
82 category) | |
83 self.counters[category] = 0 | |
84 | |
85 def stepCounter(self, category, inc=1): | |
86 self.counters[category] += inc | |
87 | |
88 def registerManifest(self, name, *, raise_if_registered=True): | |
89 if raise_if_registered and name in self.manifests: | |
90 raise Exception("Manifest '%s' has already been registered." % | |
91 name) | |
92 self.manifests[name] = [] | |
93 | |
94 def addManifestEntry(self, name, entry): | |
95 self.manifests[name].append(entry) | |
96 | |
97 def mergeStats(self, other): | |
98 for oc, ov in other.timers.items(): | |
99 v = self.timers.setdefault(oc, 0) | |
100 self.timers[oc] = v + ov | |
101 for oc, ov in other.counters.items(): | |
102 v = self.counters.setdefault(oc, 0) | |
103 self.counters[oc] = v + ov | |
104 for oc, ov in other.manifests.items(): | |
105 v = self.manifests.setdefault(oc, []) | |
106 self.manifests[oc] = v + ov | |
107 | |
108 | |
55 class Environment(object): | 109 class Environment(object): |
56 def __init__(self): | 110 def __init__(self): |
57 self.app = None | 111 self.app = None |
58 self.start_time = None | 112 self.start_time = None |
59 self.exec_info_stack = ExecutionInfoStack() | 113 self.exec_info_stack = ExecutionInfoStack() |
64 self.fs_caches = { | 118 self.fs_caches = { |
65 'renders': self.rendered_segments_repository} | 119 'renders': self.rendered_segments_repository} |
66 self.fs_cache_only_for_main_page = False | 120 self.fs_cache_only_for_main_page = False |
67 self.abort_source_use = False | 121 self.abort_source_use = False |
68 self._default_layout_extensions = None | 122 self._default_layout_extensions = None |
69 self._timers = {} | 123 self._stats = ExecutionStats() |
70 | 124 |
71 @property | 125 @property |
72 def default_layout_extensions(self): | 126 def default_layout_extensions(self): |
73 if self._default_layout_extensions is not None: | 127 if self._default_layout_extensions is not None: |
74 return self._default_layout_extensions | 128 return self._default_layout_extensions |
92 for name, repo in self.fs_caches.items(): | 146 for name, repo in self.fs_caches.items(): |
93 cache = app.cache.getCache(name) | 147 cache = app.cache.getCache(name) |
94 repo.fs_cache = cache | 148 repo.fs_cache = cache |
95 | 149 |
96 def registerTimer(self, category, *, raise_if_registered=True): | 150 def registerTimer(self, category, *, raise_if_registered=True): |
97 if raise_if_registered and category in self._timers: | 151 self._stats.registerTimer( |
98 raise Exception("Timer '%s' has already been registered." % | 152 category, raise_if_registered=raise_if_registered) |
99 category) | |
100 self._timers[category] = 0 | |
101 | 153 |
102 @contextlib.contextmanager | |
103 def timerScope(self, category): | 154 def timerScope(self, category): |
104 start = time.perf_counter() | 155 return self._stats.timerScope(category) |
105 yield | |
106 self._timers[category] += time.perf_counter() - start | |
107 | 156 |
108 def stepTimer(self, category, value): | 157 def stepTimer(self, category, value): |
109 self._timers[category] += value | 158 self._stats.stepTimer(category, value) |
110 | 159 |
111 def stepTimerSince(self, category, since): | 160 def stepTimerSince(self, category, since): |
112 self.stepTimer(category, time.perf_counter() - since) | 161 self._stats.stepTimerSince(category, since) |
162 | |
163 def registerCounter(self, category, *, raise_if_registered=True): | |
164 self._stats.registerCounter( | |
165 category, raise_if_registered=raise_if_registered) | |
166 | |
167 def stepCounter(self, category, inc=1): | |
168 self._stats.stepCounter(category, inc) | |
169 | |
170 def registerManifest(self, name, *, raise_if_registered=True): | |
171 self._stats.registerManifest( | |
172 name, raise_if_registered=raise_if_registered) | |
173 | |
174 def addManifestEntry(self, name, entry): | |
175 self._stats.addManifestEntry(name, entry) | |
176 | |
177 def getStats(self): | |
178 repos = [ | |
179 ('RenderedSegmentsRepo', self.rendered_segments_repository), | |
180 ('PagesRepo', self.page_repository)] | |
181 for name, repo in repos: | |
182 self._stats.counters['%s_hit' % name] = repo._hits | |
183 self._stats.counters['%s_miss' % name] = repo._misses | |
184 self._stats.manifests['%s_missedKeys' % name] = list(repo._missed_keys) | |
185 return self._stats | |
113 | 186 |
114 | 187 |
115 class StandardEnvironment(Environment): | 188 class StandardEnvironment(Environment): |
116 def __init__(self): | 189 def __init__(self): |
117 super(StandardEnvironment, self).__init__() | 190 super(StandardEnvironment, self).__init__() |