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