Mercurial > piecrust2
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 |