----- Original Message -----
Sent: Thursday, October 07, 2004 7:06
AM
Subject: [htmltmpl]
HTML::Template::Compile - anonymous sub and eval H::T
An item I ran into lately is a desire to squeeze even more performance
out of H::T. Since I'm in a mod_perl environment, I typically load up a
handfull of templates and then render them over and over again. To help
this out, I built a version of H::T that cross-compiles the stack-based code
into an anonymous sub(), and then eval's it to render the output. I've
found this to offer a significant performance benefit over stock H::T.
One thing to know about my environment is that I'm on a Win32 platform
(currently). Therefore, H::T::JIT wasn't an option for me.
Anyway, here's some performance numbers. This is a simple program
that creates a template, loads a bunch of parameters, and then renders it 100
times. I've included the dprofpp results for H::T and
H::T::Compile.
HTML::Template
--------------
C:\Test>perl -d:DProf foo.pl
C:\Test>dprofpp
Total Elapsed Time = 152.7336 Seconds
User+System Time = 151.4206 Seconds
Exclusive Times
%Time ExclSec CumulS
#Calls sec/call Csec/c Name
86.7 131.4 155.75
11400 0.0115 0.0137
HTML::Template::output
11.8 17.92 17.921
539401 0.0000 0.0000
HTML::Template::param
1.56 2.369 2.369
52900 0.0000 0.0000
HTML::Template::_globalize_vars
1.33 2.020
2.020 52900 0.0000 0.0000
HTML::Template::_unglobalize_vars
0.66 1.000
1.000 11300 0.0001 0.0001
HTML::Template::clear_params
0.48 0.722
151.05 1200 0.0006 0.1259
HTML::Template::LOOP::output
0.24 0.357
0.392 1 0.3567 0.3925
HTML::Template::_parse
0.11 0.169 0.169
4900 0.0000 0.0000
HTML::Template::URLESCAPE::escape
0.10 0.144
0.144 5800 0.0000 0.0000
HTML::Template::ESCAPE::escape
0.05 0.070
0.139 1 0.0699 0.1392
main::BEGIN
0.03 0.050
0.069 9 0.0055 0.0077
HTML::Template::BEGIN
0.01 0.020
0.020 1 0.0200 0.0200
HTML::Template::_init_template
0.01 0.017
0.017 577 0.0000 0.0000
HTML::Template::VAR::new
0.01 0.010
0.010 2 0.0050 0.0050
DynaLoader::BEGIN
0.01 0.010
0.010 3 0.0033 0.0033
vars::BEGIN
C:\Test>dprofpp -r
Total Elapsed Time = 152.7046
Seconds
Real Time =
152.7046 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call
Csec/c Name
86.8 132.5 157.04
11400 0.0116 0.0138
HTML::Template::output
11.7 17.94 17.945
539401 0.0000 0.0000
HTML::Template::param
1.58 2.410 2.410
52900 0.0000 0.0000
HTML::Template::_globalize_vars
1.33 2.025
2.025 52900 0.0000 0.0000
HTML::Template::_unglobalize_vars
0.66 1.009
1.009 11300 0.0001 0.0001
HTML::Template::clear_params
0.49 0.742
152.31 1200 0.0006 0.1269
HTML::Template::LOOP::output
0.24 0.367
0.402 1 0.3667 0.4025
HTML::Template::_parse
0.11 0.168 0.168
4900 0.0000 0.0000
HTML::Template::URLESCAPE::escape
0.10 0.154
0.154 5800 0.0000 0.0000
HTML::Template::ESCAPE::escape
0.05 0.070
0.149 1 0.0699 0.1492
main::BEGIN
0.03 0.050
0.079 9 0.0055 0.0088
HTML::Template::BEGIN
0.01 0.020
0.020 1 0.0200 0.0200
HTML::Template::_init_template
0.01 0.020
0.020 3 0.0067 0.0066
vars::BEGIN
0.01 0.017 0.017
577 0.0000 0.0000
HTML::Template::VAR::new
0.01 0.010
0.010 2 0.0050 0.0050
DynaLoader::BEGIN
HTML::Template::Compile
-----------------------
C:\Test>perl
-d:DProf bar.pl
C:\Test>dprofpp
Exporter::export has -6 unstacked calls in
outer
Exporter::Heavy::heavy_export has 6 unstacked calls in outer
Total
Elapsed Time = 36.19448 Seconds
User+System Time = 35.85548
Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call
Csec/c Name
43.6 15.65 27.876
11400 0.0014 0.0024
HTML::Template::Compile::_runtime_
start
36.5 13.12 13.121 403804 0.0000
0.0000 HTML::Template::param
7.93 2.845
38.938 100 0.0285 0.3894
HTML::Template::Compile::__ANON__
6.69 2.397
2.397 52900 0.0000 0.0000
HTML::Template::_globalize_vars
6.00 2.150
2.150 52900 0.0000 0.0000
HTML::Template::_unglobalize_vars
4.15 1.489
1.621 87300 0.0000 0.0000
HTML::Template::Compile::_runtime_
deref
2.97 1.065 1.065 11300
0.0001 0.0001 HTML::Template::clear_params
1.84
0.661 0.752 1 0.6610
0.7515 HTML::Template::Compile::_compile
1.05
0.377 0.392 1 0.3767
0.3925 HTML::Template::_parse
0.25 0.088
2.239 11400 0.0000 0.0002
HTML::Template::Compile::_runtime_
stop
0.24 0.085 0.091
43 0.0020 0.0021
HTML::Template::Compile::_generate
0.23 0.084
0.084 5800 0.0000 0.0000
HTML::Template::Compile::_runtime_
escape
0.22 0.079 0.078
101 0.0008 0.0008
HTML::Template::_find_file
0.17 0.060
0.248 8 0.0075 0.0310
HTML::Template::Compile::BEGIN
0.14 0.050
0.079 9 0.0055 0.0088
HTML::Template::BEGIN
C:\Test>dprofpp -r
Exporter::export has -6 unstacked calls in
outer
Exporter::Heavy::heavy_export has 6 unstacked calls in outer
Total
Elapsed Time = 36.14248
Seconds
Real Time =
36.14248 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call
Csec/c Name
44.1 15.93 28.116
11400 0.0014 0.0025
HTML::Template::Compile::_runtime_
start
36.1 13.05 13.053 403804 0.0000
0.0000 HTML::Template::param
8.17 2.954
39.267 100 0.0295 0.3927
HTML::Template::Compile::__ANON__
6.69 2.419
2.419 52900 0.0000 0.0000
HTML::Template::_globalize_vars
5.97 2.158
2.158 52900 0.0000 0.0000
HTML::Template::_unglobalize_vars
4.02 1.453
1.605 87300 0.0000 0.0000
HTML::Template::Compile::_runtime_
deref
2.91 1.051 1.051 11300
0.0001 0.0001 HTML::Template::clear_params
1.83
0.661 0.752 1 0.6610
0.7515 HTML::Template::Compile::_compile
1.04
0.377 0.392 1 0.3767
0.3925 HTML::Template::_parse
0.26 0.094
0.094 5800 0.0000 0.0000
HTML::Template::Compile::_runtime_
escape
0.24 0.088 2.247 11400
0.0000 0.0002
HTML::Template::Compile::_runtime_
stop
0.24 0.085 0.091
43 0.0020 0.0021
HTML::Template::Compile::_generate
0.19 0.069
0.078 101 0.0007 0.0008
HTML::Template::_find_file
0.17 0.060
0.258 8 0.0075 0.0322
HTML::Template::Compile::BEGIN
0.16 0.058
0.058 4900 0.0000 0.0000
HTML::Template::Compile::_runtime_
urlescape
I've been using this on my site for about a month now. It supports
all of the features of H::T, and also includes the enhancements I've done
locally. I would like to figure out a way to share it (if it's of
interest) 'cause I'm sure the manner in which it's implemented could always be
improved.
- Bob Diss
Do you Yahoo!?
vote.yahoo.com -
Register online to vote today!