Hi Hakim,
I think you might be over analysing the problem. :-)
When a TMPL_LOOP is encountered, H::T needs to create (for want of a
better description) a child context, that contains only the template
variables for the child. Each child context is effectively a new H::T
object, so that the very top H::T object accumulates the output from
each child.
By removing the LOOP, you are effectively completely avoiding the child
context thus saving quite a significant amount of processing.
If you are looking for performance increases, you should start simply by
printing a hi-res time from various points within "output()". I have
done this previously and found that I was able to find a dramatic
increase in performance, just by removing foreach() loops. **
regards,
Mathew Robertson
** If you interested, I can send you a patch which ("works for me")
speed's up the template-variable symbol resolution. This patch has
achieved close to 20x speed up under some circumstances. Most templates
are speed up by about 1.5x.
Hakim Cassimally wrote:
> Hakim Cassimally wrote:
>
>> Hi,
>>
>> We're having an "interesting" problem with a significant slowdown in
>> processing of some HTML::Template templates.
>>
>
> The current suspicion, after HTML bod and $boss worked on this,
> by a process of elimination is that the problem is when the same
> data structure is used twice in the same ->output() call.
>
> So, in some cases, the loop "REGION" below, was used twice in
> two separate TMPL_LOOP cases. This seems to add as much as
> 0.5 seconds every time the parameter is reused.
>
> The workaround seems to be to clone the data structure and
> create two separate parameters, which seems very wrong. Has
> anyone else experienced this? (It might be a feature of our
> framework code rather than H::T, I'll work on the minimal test
> case on Friday after a release...)
>
> Cheerio,
> Hakim
>
>
>> We are using:
>> - using H::T 2.8 and 2.9
>> - an house framework that feeds params from a CGI object to H::T
>> - CGI 2.81 and 3.15
>> - Perl 5.8.0 and 5.8.4
>>
>> If the following conditions hold:
>>
>> - template X is <TMPL_INCL>uded
>> - the parameter "region" is set (for <TMPL_LOOP NAME="REGION">)
>>
>> then processing time for the template is approx 1 second longer.
>>
>> However
>>
>> - if either the TMPL_INCL or the TMPL_LOOPs are commented, processing
>> time is reduced
>> - the TMPL_INCL does *not* refer to the TMPL_LOOP, and neither does the
>> one template it in turn includes.
>>
>> The DProf runs include the following (with some entries for BEGIN on
>> inhouse modules removed) :
>>
>> --------------- without including TMPL_LOOP
>>
>> $ dprofpp -rI
>> province_noprov.out
>> Total Elapsed Time = 1.346560 Seconds
>> Real Time = 1.346560 Seconds
>> Inclusive Times
>> %Time ExclSec CumulS #Calls sec/call Csec/c Name
>> 65.7 0.030 0.885 5 0.0060 0.1770 main::BEGIN
>> 43.8 0.008 0.590 1 0.0083 0.5899 Our::Application::pageOutput
>> 43.8 0.000 0.590 1 0.0000 0.5897
>> Our::Application::printPageOutput
>> 9.43 0.050 0.127 78 0.0006 0.0016 HTML::Template::BEGIN
>> 8.69 0.000 0.117 539 0.0000 0.0002 JSON::Parser::value
>> 8.24 0.120 0.111 9267 0.0000 0.0000 HTML::Template::param
>> 7.28 0.000 0.098 2 0.0000 0.0488 HTML::Template::_init
>>
>> --------------- with the TMPL_LOOP
>>
>> $ dprofpp -rI
>> province_prov.out
>> Total Elapsed Time = 2.443450 Seconds
>> Real Time = 2.443450 Seconds
>> Inclusive Times
>> %Time ExclSec CumulS #Calls sec/call Csec/c Name
>> 109. 1.149 2.676 387 0.0030 0.0069 HTML::Template::BEGIN
>> 76.8 0.000 1.877 1 0.0000 1.8765
>> Our::Application::printPageOutput
>> 76.4 0.027 1.867 1 0.0275 1.8668 Our::Application::pageOutput
>> 55.5 0.010 1.356 8 0.0012 0.1696 HTML::Template::LOOP::output
>> 34.9 0.020 0.853 5 0.0040 0.1705 main::BEGIN
>> 10.4 0.300 0.256 28736 0.0000 0.0000 HTML::Template::param
>>
>> e.g. the odd things include
>>
>> - "HTML::Template::BEGIN" is called a large number of times. I don't
>> see that many BEGIN { } or 'use' blocks in the H::T code, nor do I
>> understand why they would be called because of a TMPL_INCL
>>
>> - HTML::Template::LOOP::output takes proportionally much longer.
>>
>> I'm sorry that this isn't a minimal test case - I'm working with our
>> HTML editor to try to identify what it is! But if anyone has any
>> suggestions on where to start trying to debug this, I'd be interested,
>> and grateful, to see what you suggest.
>>
>> Regards,
>>
>> Hakim (osfameron)
>>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> Html-template-users mailing list
> Html-template-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/html-template-users
>
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Html-template-users mailing list
Html-template-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/html-template-users