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 |
