comparison piecrust/baking/baker.py @ 1011:c4cf3cfe2726

bake: Better performance stats, and add callback to preload templates.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 26 Nov 2017 22:23:03 -0800
parents 09dc0240f08a
children 071f30aa04bb
comparison
equal deleted inserted replaced
1010:501bd4ab7e06 1011:c4cf3cfe2726
52 self.app.config.set('baker/is_baking', True) 52 self.app.config.set('baker/is_baking', True)
53 self.app.config.set('site/asset_url_format', '%page_uri%/%filename%') 53 self.app.config.set('site/asset_url_format', '%page_uri%/%filename%')
54 54
55 stats = self.app.env.stats 55 stats = self.app.env.stats
56 stats.registerTimer('LoadSourceContents', raise_if_registered=False) 56 stats.registerTimer('LoadSourceContents', raise_if_registered=False)
57 stats.registerTimer('MasterTaskPut_1', raise_if_registered=False) 57 stats.registerTimer('CacheTemplates', raise_if_registered=False)
58 stats.registerTimer('MasterTaskPut_2+', raise_if_registered=False)
59 58
60 # Make sure the output directory exists. 59 # Make sure the output directory exists.
61 if not os.path.isdir(self.out_dir): 60 if not os.path.isdir(self.out_dir):
62 os.makedirs(self.out_dir, 0o755) 61 os.makedirs(self.out_dir, 0o755)
63 62
96 pool = self._createWorkerPool(records_path, pool_userdata) 95 pool = self._createWorkerPool(records_path, pool_userdata)
97 96
98 # Done with all the setup, let's start the actual work. 97 # Done with all the setup, let's start the actual work.
99 logger.info(format_timed(start_time, "setup baker")) 98 logger.info(format_timed(start_time, "setup baker"))
100 99
101 # Load all sources. 100 # Load all sources, pre-cache templates.
102 self._loadSources(ppmngr) 101 self._loadSources(ppmngr)
102 self._populateTemplateCaches()
103 103
104 # Bake the realms. 104 # Bake the realms.
105 self._bakeRealms(pool, ppmngr, record_histories) 105 self._bakeRealms(pool, ppmngr, record_histories)
106 106
107 # Handle deletions, collapse records, etc. 107 # Handle deletions, collapse records, etc.
214 if rec_entries is not None: 214 if rec_entries is not None:
215 for e in rec_entries: 215 for e in rec_entries:
216 rec.addEntry(e) 216 rec.addEntry(e)
217 217
218 stats = self.app.env.stats 218 stats = self.app.env.stats
219 stats.stepTimer('LoadSourceContents', 219 stats.stepTimer('LoadSourceContents', time.perf_counter() - start_time)
220 time.perf_counter() - start_time)
221 logger.info(format_timed(start_time, "loaded site content")) 220 logger.info(format_timed(start_time, "loaded site content"))
221
222 def _populateTemplateCaches(self):
223 start_time = time.perf_counter()
224
225 for eng in self.app.plugin_loader.getTemplateEngines():
226 eng.populateCache()
227
228 stats = self.app.env.stats
229 stats.stepTimer('CacheTemplates', time.perf_counter() - start_time)
230 logger.info(format_timed(start_time, "cache templates"))
222 231
223 def _bakeRealms(self, pool, ppmngr, record_histories): 232 def _bakeRealms(self, pool, ppmngr, record_histories):
224 # Bake the realms -- user first, theme second, so that a user item 233 # Bake the realms -- user first, theme second, so that a user item
225 # can override a theme item. 234 # can override a theme item.
226 # Do this for as many times as we have pipeline passes left to do. 235 # Do this for as many times as we have pipeline passes left to do.
270 logger.debug( 279 logger.debug(
271 "Queued %d jobs for source '%s' using pipeline '%s' " 280 "Queued %d jobs for source '%s' using pipeline '%s' "
272 "(%s, step 0)." % 281 "(%s, step 0)." %
273 (new_job_count, src.name, pp.PIPELINE_NAME, realm_name)) 282 (new_job_count, src.name, pp.PIPELINE_NAME, realm_name))
274 283
275 stats.stepTimer('MasterTaskPut_1', time.perf_counter() - start_time)
276
277 if job_count == 0: 284 if job_count == 0:
278 logger.debug("No jobs queued! Bailing out of this bake pass.") 285 logger.debug("No jobs queued! Bailing out of this bake pass.")
279 return 286 return
280 287
281 pool.wait() 288 pool.wait()
312 319
313 job_count += len(jobs) 320 job_count += len(jobs)
314 pool.userdata.next_step_jobs[sn] = [] 321 pool.userdata.next_step_jobs[sn] = []
315 pool.queueJobs(jobs) 322 pool.queueJobs(jobs)
316 participating_source_names.append(sn) 323 participating_source_names.append(sn)
317
318 stats.stepTimer('MasterTaskPut_2+', time.perf_counter() - start_time)
319 324
320 if job_count == 0: 325 if job_count == 0:
321 break 326 break
322 327
323 pool.wait() 328 pool.wait()