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__()