in reply to I need to template this

If H::T is sufficient for your needs, then don't switch. If it's not, then go to Template Toolkit. H::T was built, just so you know, as a reaction to TT version 1 because samtregar thought it was too heavy for his needs.

There are a lot of good reasons to use H::T over TT:

Now, TT is more featureful and has its own UI-compatible friends, like Jemplate. It all depends on what your needs are.


My criteria for good software:
  1. Does it work?
  2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

Replies are listed 'Best First'.
Re^2: I need to template this
by Rhandom (Curate) on Apr 19, 2007 at 21:10 UTC
    TT is too heavy for what you want
    Sorry - this is long...

    I hear the "too heavy" argument a lot as a reason to not use TT. I've provided a test script below with benchmarks that show relative speed for a highly contrived template. If TT is used in a mod_perl environment - it is faster than HT. In a non-mod_perl environment (or also in a mod_perl environment you could always use CGI::Ex::Template and then you have the full features of TT with the "lightness" of HTML::Template.

    The other reason I hear is because they don't want to give too much ability to the HTML designers or because they don't want to have business logic in the templates. The first point seems roughly equivalent to SysAdmins on my network telling me I have to use Lua because they don't want me to have too many features in my programming. On the second point - there is almost nothing you can do to prevent your designers from controlling business logic from the HTML -- Javascript provides all the rope they need to hang themselves. The only option here is to ask them not to do that.

    So if all the points for using H::T are really veiled non-issues - then the only real reason to pick H::T over TT or likewise to pick TT over H::T is one of religion and is generally based on what system the developer started with in the first place.

    Well - anyway - the following is a script that tests the templates under different operational modes - passing in a string containing the template, passing in a file containing the template, and caching the template in memory, or the compiled template on the file system (isn't it funny that they all have essentially the same feature sets but have diffent APIs and syntax). This file is included with the CGI::Ex suite under the samples/benchmark directory. Unfortunately the copy of this file on cpan is out of date - but will include this updated file in the next release.



    That script output the output below on my machine (I've removed some of the timethese output to shorten what is presented). Remember that the template is used for the test is trivially short - but it does give a good approximation of "heavy" vs "light". The following abreviations are used:
    TT - Template Toolkit with non-XS stash TTX - Template Toolkit with XS stash HTE - HTML::Template::Expr HT - HTML::Template CET - CGI::Ex::Template _str - Means the module was passed a string containing the templat +e. _compile - Means the template was cached on the file system. _mem - Means the template was cached in memory. ---------------------------------------------------------------------- +-- From a string or scalarref tests Rate TT_str TTX_str HTE_str HT_str CET_str Te +xtTemplate TT_str 273/s -- -8% -72% -80% -82% + -83% TTX_str 296/s 9% -- -69% -78% -80% + -82% HTE_str 961/s 252% 224% -- -29% -36% + -40% HT_str 1346/s 393% 354% 40% -- -10% + -16% CET_str 1499/s 449% 406% 56% 11% -- + -7% TextTemplate 1605/s 488% 442% 67% 19% 7% + -- ---------------------------------------------------------------------- +-- Compiled and cached on the file system tests Rate TT_compile TTX_compile HT_compile CET_compile TT_compile 694/s -- -11% -62% -71% TTX_compile 775/s 12% -- -57% -67% HT_compile 1817/s 162% 134% -- -23% CET_compile 2353/s 239% 204% 30% -- ---------------------------------------------------------------------- +-- Cached in memory tests Rate HTE_mem TT_mem HT_mem TTX_mem CET_mem HTE_mem 1374/s -- -37% -41% -57% -60% TT_mem 2167/s 58% -- -7% -31% -38% HT_mem 2340/s 70% 8% -- -26% -33% TTX_mem 3163/s 130% 46% 35% -- -9% CET_mem 3474/s 153% 60% 48% 10% -- ---------------------------------------------------------------------- +-- All variants together Rate TT_str TTX_str TT_compile TTX_compile HTE_str HT_s +tr HTE_mem CET_str TextTemplate HT_compile TT_mem CET_compile HT_mem +TTX_mem CET_mem TT_str 285/s -- -0% -59% -64% -68% -7 +9% -79% -80% -83% -84% -87% -88% -89% + -90% -92% TTX_str 286/s 0% -- -59% -63% -68% -7 +9% -79% -80% -83% -84% -87% -88% -88% + -90% -92% TT_compile 692/s 143% 142% -- -11% -23% -4 +9% -49% -51% -59% -62% -68% -70% -72% + -76% -81% TTX_compile 782/s 175% 174% 13% -- -13% -4 +2% -43% -45% -54% -57% -64% -67% -68% + -73% -78% HTE_str 903/s 217% 216% 30% 15% -- -3 +3% -34% -36% -47% -50% -59% -62% -64% + -69% -75% HT_str 1346/s 373% 371% 94% 72% 49% +-- -1% -5% -21% -26% -38% -43% -46% + -54% -63% HTE_mem 1360/s 378% 376% 96% 74% 51% +1% -- -3% -20% -25% -38% -42% -45% + -54% -62% CET_str 1409/s 395% 393% 104% 80% 56% +5% 4% -- -17% -22% -35% -40% -43% + -52% -61% TextTemplate 1697/s 496% 494% 145% 117% 88% 2 +6% 25% 20% -- -7% -22% -28% -32% + -42% -53% HT_compile 1816/s 538% 536% 162% 132% 101% 3 +5% 34% 29% 7% -- -17% -23% -27% + -38% -50% TT_mem 2177/s 665% 662% 214% 178% 141% 6 +2% 60% 54% 28% 20% -- -7% -12% + -26% -40% CET_compile 2346/s 724% 721% 239% 200% 160% 7 +4% 72% 66% 38% 29% 8% -- -5% + -20% -35% HT_mem 2477/s 770% 767% 258% 217% 174% 8 +4% 82% 76% 46% 36% 14% 6% -- + -16% -32% TTX_mem 2943/s 934% 930% 325% 276% 226% 11 +9% 116% 109% 73% 62% 35% 25% 19% + -- -19% CET_mem 3617/s 1171% 1166% 423% 363% 301% 16 +9% 166% 157% 113% 99% 66% 54% 46% + 23% --


    So using Template Toolkit with the XS stash in a mod_perl environment would offer the best performance (not counting CGI::Ex::Template in a cached environment). I do agree that using TT in a CGI environment without any caching may be a bit heavy (I use CGI::Ex::Template in those cases). This has been a long answer to a short comment about TT being too heavy. Apache is heavy too - but it gets the job done.

    Personally I use whatever templating system the previous coder used when I go in and maintain code. But on all new work I use CGI::Ex::Template because it gives me the power of TT, but is even faster and lighter.

    my @a=qw(random brilliant braindead); print $a[rand(@a)];
      Dude, where's HTML::Template::JIT? I guess you didn't want to blow your premise by including the fastest templating system known to man. (I kid - honestly there's a good reason no one uses it, and that's because templating is almost never the bottleneck!)

      -sam

        I remember reading about H::T::JIT - I just forgot where to look.

        I really think that the way to go is to have all of the various template languages compile to an opcode tree - a common opcode tree - and then make a common runtime engine that is blazingly fast - for all of them. Maybe once parrot and perl6 are done we can just compile the templates to parrot bytecode with optional JIT (if that ever becomes mainstream).

        Really though - I don't know of anybody using H::T - but I know lots of people using H::T::Expr. There wouldn't happen to be a H::T::Expr::JIT would there. I don't think so as there isn't even a file_cache version of H::T::Expr.

        I think the H::T::JIT must be a pretty dandy piece of work. I will add it to the tests - I'm curious now.

        my @a=qw(random brilliant braindead); print $a[rand(@a)];
Re^2: I need to template this
by polettix (Vicar) on Apr 20, 2007 at 13:02 UTC