Do you have any info on how you tested? Is there doc for how to read that profiling output?
Mike -----Original Message----- From: [email protected] [mailto:[EMAIL PROTECTED] On Behalf Of Brian Cole Sent: Tuesday, August 14, 2007 7:17 PM To: [email protected] Subject: [TurboGears] Improving Kid Template Performance? I have a fairly static page containing many widgets (100+). I've done all I can to cache widget instantiation so that no widgets are actually instantiated (unless a particular cached widget has become stale) during the page call. This shaved about 3 seconds off of 9 second page load. The expose(template="page") decorator around my method is still taking a long time. The perpetrator appears to be Kid. Here is the profile output showing it: Tue Aug 14 18:10:02 2007 ./profile/cp_0026.prof 7030416 function calls (3574371 primitive calls) in 29.440 CPU seconds Ordered by: cumulative time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.000 0.000 29.440 29.440 profile:0(<bound method Request._run of <cherrypy._cphttptools.Request object at 0x2c65990>>) 1 0.000 0.000 29.440 29.440 _cphttptools.py:82(_run) 1 0.000 0.000 29.430 29.430 controllers.py:376(_execute_func) 1 0.000 0.000 29.430 29.430 controllers.py:333(expose) 1 0.000 0.000 29.430 29.430 <string>:4(_expose) 1 0.000 0.000 29.430 29.430 <string>:2(admin) 1 0.000 0.000 29.430 29.430 controllers.py:356(<lambda>) 1 0.000 0.000 29.430 29.430 <string>:4(run_with_transaction) 1 0.000 0.000 29.430 29.430 _cphttptools.py:241(main) 1 0.000 0.000 29.430 29.430 database.py:303(so_rwt) 1 0.000 0.000 29.350 29.350 controllers.py:30(_process_output) 9079/38 0.140 0.000 29.150 0.767 :0(join) 1 0.000 0.000 29.150 29.150 base.py:99(render) 1 0.000 0.000 29.150 29.150 serialization.py:104(serialize) 1 0.000 0.000 29.150 29.150 kidsupport.py:150(render) 1 0.000 0.000 29.150 29.150 kid/__init__.py:276(serialize) 44138 0.810 0.000 29.080 0.001 serialization.py:564(generate) 33374 0.280 0.000 27.180 0.001 serialization.py:140(format_stream) 279479/28078 2.740 0.000 26.460 0.001 parser.py:209(_coalesce) 28078 0.150 0.000 26.170 0.001 serialization.py:468(inject_meta_tags) 840227/28075 3.590 0.000 26.020 0.001 parser.py:174(_track) 251486/28075 1.440 0.000 25.880 0.001 filter.py:25(apply_matches) 1806/12 1.120 0.001 23.360 1.947 parser.py:96(expand) 28015 0.100 0.000 20.690 0.001 admin.py:26(_pull) 1802/9 0.040 0.000 19.290 2.143 kidsupport.py:197(transform) 1063/1 0.000 0.000 19.290 19.290 base.py:356(display) 86/1 0.000 0.000 19.290 19.290 meta.py:102(lockwidget) 1802/9 0.080 0.000 19.290 2.143 base.py:233(display) 176312/27986 1.280 0.000 17.930 0.001 <string>:24(_pull) 85/17 0.010 0.000 14.040 0.826 togglesection.py:61(update_params) 2152800/226209 7.230 0.000 7.930 0.000 parser.py:156(_pull) 11543/153 0.120 0.000 5.110 0.033 forms.py:49(_update_path) 1054/153 0.000 0.000 5.100 0.033 forms.py:235(display) 28032 0.130 0.000 1.610 0.000 sitetemplate.py:66(_match_func) 28032 0.100 0.000 1.380 0.000 master.py:88(_match_func) 1807 0.250 0.000 1.330 0.001 template_util.py:38(get_locals) 969 0.010 0.000 1.040 0.001 forms.py:449(update_params) 488436 1.000 0.000 1.000 0.000 :0(append) 1803 0.060 0.000 0.810 0.000 base.py:269(stdvars) 2771 0.070 0.000 0.790 0.000 forms.py:168(_get_name_path) 1807 0.420 0.000 0.790 0.000 inspect.py:166(getmembers) 261819/219863 0.520 0.000 0.760 0.000 :0(getattr) 74693 0.470 0.000 0.720 0.000 element.py:24(__init__) 1054 0.020 0.000 0.720 0.001 forms.py:250(update_params) 64044 0.360 0.000 0.630 0.000 element.py:60(append) 128732 0.400 0.000 0.620 0.000 parser.py:196(to_unicode) 363520 0.560 0.000 0.560 0.000 :0(isinstance) 1803 0.010 0.000 0.550 0.000 utils.py:45(get_locale) 11543 0.090 0.000 0.540 0.000 forms.py:25(append_to_path) 175503 0.480 0.000 0.480 0.000 :0(pop) 3062 0.010 0.000 0.470 0.000 template_util.py:279(make_updated_attrib) 54906 0.300 0.000 0.470 0.000 cherrypy/__init__.py:41(__getattr__) 3885 0.060 0.000 0.450 0.000 template_util.py:137(make_attrib) 1803 0.020 0.000 0.450 0.000 utils.py:54(_get_locale) 12808/6986 0.170 0.000 0.390 0.000 template_util.py:156(generate_attrib) 5983 0.050 0.000 0.350 0.000 config.py:210(get) 82369 0.230 0.000 0.330 0.000 :0(hasattr) 6001 0.190 0.000 0.300 0.000 config.py:107(get) 134184 0.290 0.000 0.290 0.000 :0(startswith) The following works for caching the entire page contents but what I really need to do is cache only portions of the page to allow for parts to change quickly. @expose(template="page") def _page(self, **kw): val = self.alterSomething(kw) return dict(wdgt=self.wdgt, value=val) cache = None @expose() def page(self, **kw): if self.cache is None or self.requiresChange(kw): self.cache = self._page(**kw) return self.cache Caching individual segments of the page will require a lot more complexity. Is there a way to make Kid go faster? I can't use psyco because I'm running on an x86_64 machine. I even tried to hack cElementTree back into Kid (it was taken out for some reason: http://kid-templating.org/notes.html#celementtree-support) Or have I reached the limits of TurboGears and this is why there's support for other templating engines? And I just really got to like the TG widget system... Thanks, Brian --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

