comparison piecrust/rendering.py @ 419:6801ad5aa1d4

internal: Optimize page segments rendering. * Don't create the page data up-front, since it's wasted work if the page has cached rendered segments. * Add a performance counter for data building.
author Ludovic Chabant <ludovic@chabant.com>
date Sat, 20 Jun 2015 23:25:38 -0700
parents 0e9a94b7fdfa
children 3b658190c02b
comparison
equal deleted inserted replaced
418:d5724c0c8f1a 419:6801ad5aa1d4
249 249
250 def render_page_segments(ctx): 250 def render_page_segments(ctx):
251 eis = ctx.app.env.exec_info_stack 251 eis = ctx.app.env.exec_info_stack
252 eis.pushPage(ctx.page, ctx) 252 eis.pushPage(ctx.page, ctx)
253 try: 253 try:
254 page_data = _build_render_data(ctx)
255
256 ctx.setCurrentPass(PASS_FORMATTING) 254 ctx.setCurrentPass(PASS_FORMATTING)
257 repo = ctx.app.env.rendered_segments_repository 255 repo = ctx.app.env.rendered_segments_repository
258 save_to_fs = True 256 save_to_fs = True
259 if ctx.app.env.fs_cache_only_for_main_page and not eis.is_main_page: 257 if ctx.app.env.fs_cache_only_for_main_page and not eis.is_main_page:
260 save_to_fs = False 258 save_to_fs = False
261 if repo and not ctx.force_render: 259 if repo and not ctx.force_render:
262 render_result = repo.get( 260 render_result = repo.get(
263 ctx.uri, 261 ctx.uri,
264 lambda: _do_render_page_segments(ctx.page, page_data), 262 lambda: _do_render_page_segments_from_ctx(ctx),
265 fs_cache_time=ctx.page.path_mtime, 263 fs_cache_time=ctx.page.path_mtime,
266 save_to_fs=save_to_fs) 264 save_to_fs=save_to_fs)
267 else: 265 else:
268 render_result = _do_render_page_segments(ctx.page, page_data) 266 render_result = _do_render_page_segments_from_ctx(ctx)
269 if repo: 267 if repo:
270 repo.put(ctx.uri, render_result, save_to_fs) 268 repo.put(ctx.uri, render_result, save_to_fs)
271 finally: 269 finally:
272 ctx.setCurrentPass(PASS_NONE) 270 ctx.setCurrentPass(PASS_NONE)
273 eis.popPage() 271 eis.popPage()
277 RenderPassInfo._fromJson(render_result['pass_info'])) 275 RenderPassInfo._fromJson(render_result['pass_info']))
278 return rs 276 return rs
279 277
280 278
281 def _build_render_data(ctx): 279 def _build_render_data(ctx):
282 data_ctx = DataBuildingContext(ctx.page, page_num=ctx.page_num) 280 with ctx.app.env.timerScope("PageDataBuild"):
283 data_ctx.pagination_source = ctx.pagination_source 281 data_ctx = DataBuildingContext(ctx.page, page_num=ctx.page_num)
284 data_ctx.pagination_filter = ctx.pagination_filter 282 data_ctx.pagination_source = ctx.pagination_source
285 page_data = build_page_data(data_ctx) 283 data_ctx.pagination_filter = ctx.pagination_filter
286 if ctx.custom_data: 284 page_data = build_page_data(data_ctx)
287 page_data.update(ctx.custom_data) 285 if ctx.custom_data:
288 return page_data 286 page_data.update(ctx.custom_data)
287 return page_data
288
289
290 def _do_render_page_segments_from_ctx(ctx):
291 page_data = _build_render_data(ctx)
292 return _do_render_page_segments(ctx.page, page_data)
289 293
290 294
291 def _do_render_page_segments(page, page_data): 295 def _do_render_page_segments(page, page_data):
292 app = page.app 296 app = page.app
293 297