JavaScript template language shootoff

JavaScript performance comparison

Revision 985 of this test case created by Kingkong and last updated

Preparation code

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

<script src="https://raw.github.com/documentcloud/underscore/master/underscore.js"></script>

<script src="http://ajax.cdnjs.com/ajax/libs/mustache.js/0.3.0/mustache.min.js"></script>

<script src="https://github.com/downloads/wycats/handlebars.js/handlebars.1.0.0.beta.3.js"></script>

<script src="http://cdn.kendostatic.com/2012.1.322/js/kendo.all.min.js"></script>

<script src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js"></script> 

<script src="http://borismoore.github.com/jsrender/jsrender.js"></script>

<script src="https://raw.github.com/twitter/hogan.js/master/lib/template.js"></script>
<script src="https://raw.github.com/twitter/hogan.js/master/lib/compiler.js"></script>
<script src="https://github.com/olado/doT/raw/master/doT.js">
</script>

<script>
                  
var aro = {};

aro.string = new function ()
{
    /**
     * @var {Object}
     */
    this.escapes_html = 
    {
        '\\': '&#92;',
        '&': '&amp;',
        '<': '&lt;',
        '>': '&gt;',
        '"': '&quot;',
        "'": '&#39;',
        "/": '&#47;'
    };
    
    /**
     * @var {RexExp}
     */
    this.escape_html_reg = /[&<>"'\/\\]/g;
    
    /**
     * @param {String} string
     * @returns {String}
     */
    this.escapeHtml = function(string) 
    {
        return string.replace(
            this.escape_html_reg,
            function (match)
            {
                return aro.string.escapes_html[match];
            }
        );
    };
};


aro.template = new function()
{
    /**
     * @var {String}
     */
    this.opener = '<#',
                
    /**
     * @var {String}
     */
    this.closer = '#>';
    
    /**
     * Retourne le corp d'une fonction correspondante à un template
     * 
     * @param {String} template
     * @param {Object} options
     * @returns {String}
     */
    function transform(template, options)
    {
        var fn_body = 'var r=\'\';',
            code = false,
            code_op = 0,//1 == concat, 2 == concat + escape
            is_last_code_block = true,
            is_escape = false,
            char = '',
            from = 0,
            opener_chars = (options.opener || aro.template.opener).split(''),
            closer_chars = (options.closer || aro.template.closer).split(''),
            opener_chars_len = opener_chars.length,
            closer_chars_len = closer_chars.length,
            frag,
            j, to, l, char;

        source : for(to = 0, l = template.length - (closer_chars_len - 1); to < l; to++)
        {
            char = template[to];

            //ouverture block code
            if(!code)
            {
                if(!is_escape && char === opener_chars[0])
                {
                    for(j = 1; j < opener_chars_len; j++)
                    {
                        if(opener_chars[j] !== template[to + j])
                        {
                            continue source;
                        }
                    }
                    
                    code = true;
                    if(from < to)
                    {
                        fn_body += (is_last_code_block ? 'r+=' : '+') + JSON.stringify(template.slice(from, to));
                    }
                    
                    to += opener_chars_len - 1;
                    from = to;
                }
            }
            //code concat 
            else if(!code_op && from === to - 1)
            {//alert(char);
                if(char === '=')
                {
                    from++;
                    code_op = 1;
                    is_last_code_block = false;
                }
                else if(char === '-')
                {
                    from++;
                    code_op = 2;
                    is_last_code_block = false;
                }
                else
                {
                    code_op = 0;
                    is_last_code_block = true;
                    from && (fn_body += ';');
                }
            }   
            //fermeture block code
            else if(!is_escape && char === closer_chars[0])
            {
                for(j = 1; j < closer_chars_len; j++)
                {
                    if(closer_chars[j] !== template[to + j])
                    {
                        continue source;
                    }
                }
                
                if(from < to)
                {
                    frag = template.slice(from + opener_chars_len, to);//alert(frag);
                    fn_body += !code_op  ? frag : (is_last_code_block ? 'r+=' : '+') +
                           (code_op === 2  ? 'aro.string.escapeHtml(' + frag + ')'  : '(' + frag + ')');
                }
                
                code = false;
                code_op = 0;
                
                from = to + closer_chars_len;
                to = from;
            }

            is_escape = char === '\\';
        }

        if(from < to - 1)
        {
            fn_body += (is_last_code_block ? 'r+=' : '+') + JSON.stringify(template.slice(from, to)) + ';';
        }
        
        return fn_body += 'return r;';
    }
    
    /**
     * Retourne la fonction correspondante au template sous forme de chaine
     *  
     * @param {String} template
     * @param {Object} options
     * @param {String} name
     * @returns {String}
     */
    this.getSource = function(template, options, name)
    {
        return 'function ' + (name || '') + '(data){' + transform(template, options || {}) + '}';
    };
    
    /**
     * Retourne la fonction correspondante au template
     *  
     * @param {String} template
     * @param {Object} options
     * @returns {Function}
     */
    this.compile = function(template, options)
    {
        return Function(
            'data',
            transform(template, options || {})
        );
    };
};
      
            
</script>
<!--External Template Definitions-->
<script type="text/x-kendo-template" id="kendoUIextTemplate">
<div>
<h1 class='header'>#= data.header #</h1>
<h2 class='header2'>#= data.header2 #</h2>
<h3 class='header3'>#= data.header3 #</h3>
<h4 class='header4'>#= data.header4 #</h4>
<h5 class='header5'>#= data.header5 #</h5>
<h6 class='header6'>#= data.header6 #</h6>
<ul class='list'>
   # for (var i = 0, l = data.list.length; i < l; i++) { #
   <li class='item'>#= data.list[i] #</li>
   # } #
</ul>
</div>
</script>
<script>
  window.sharedVariables = {
   header: "Header",
   header2: "Header2",
   header3: "Header3",
   header4: "Header4",
   header5: "Header5",
   header6: "Header6",
   list: ['1000000000', '2', '3', '4', '5', '6', '7', '8', '9', '10']
  };
  

  //JsRender compiled template (no encoding)
  window.jsRenderTemplate = $.templates("<div><h1 class='header'>{{:header}}</h1><h2 class='header2'>{{:header2}}</h2><h3 class='header3'>{{:header3}}</h3><h4 class='header4'>{{:header4}}</h4><h5 class='header5'>{{:header5}}</h5><h6 class='header6'>{{:header6}}</h6><ul class='list'>{{for list}}<li class='item'>{{:#data}}</li>{{/for}}</ul></div>");
  
  window.mustacheTemplate = "<div><h1 class='header'>{{{header}}}</h1><h2 class='header2'>{{{header2}}}</h2><h3 class='header3'>{{{header3}}}</h3><h4 class='header4'>{{{header4}}}</h4><h5 class='header5'>{{{header5}}}</h5><h6 class='header6'>{{{header6}}}</h6><ul class='list'>{{#list}}<li class='item'>{{{.}}}</li>{{/list}}</ul></div>";
  
  window.handlebarsTemplate = Handlebars.compile("<div><h1 class='header'>{{header}}</h1><h2 class='header2'>{{header2}}</h2><h3 class='header3'>{{header3}}</h3><h4 class='header4'>{{header4}}</h4><h5 class='header5'>{{header5}}</h5><h6 class='header6'>{{header6}}</h6><ul class='list'>{{#each list}}<li class='item'>{{this}}</li>{{/each}}</ul></div>");
  
  window.kendouiTemplate = kendo.template("<div><h1 class='header'>#= data.header #</h1><h2 class='header2'>#= data.header2 #</h2><h3 class='header3'>#= data.header3 #</h3><h4 class='header4'>#= data.header4 #</h4><h5 class='header5'>#= data.header5 #</h5><h6 class='header6'>#= data.header6 #</h6><ul class='list'># for (var i = 0, l = data.list.length; i < l; i++) { #<li class='item'>#= data.list[i] #</li># } #</ul></div>", {useWithBlock:true});
  
  window.kendouiTemplate2 = kendo.template("<div><h1 class='header'>#= data.header #</h1><h2 class='header2'>#= data.header2 #</h2><h3 class='header3'>#= data.header3 #</h3><h4 class='header4'>#= data.header4 #</h4><h5 class='header5'>#= data.header5 #</h5><h6 class='header6'>#= data.header6 #</h6><ul class='list'># for (var i = 0, l = data.list.length; i < l; i++) { #<li class='item'>#= data.list[i] #</li># } #</ul></div>", {useWithBlock:false});
  
  //Use external template definition
  window.kendoUIAlt = kendo.template($("#kendoUIextTemplate").html());
  window.kendoUIAlt2 = kendo.template($("#kendoUIextTemplate").html(), {useWithBlock:false});
  
  window.underscoreTemplate = _.template("<div><h1 class='header'><%= header %></h1><h2 class='header2'><%= header2 %></h2><h3 class='header3'><%= header3 %></h3><h4 class='header4'><%= header4 %></h4><h5 class='header5'><%= header5 %></h5><h6 class='header6'><%= header6 %></h6><ul class='list'><% for (var i = 0, l = list.length; i < l; i++) { %><li class='item'><%= list[i] %></li><% } %></ul></div>");
  
  window.underscoreTemplateNoWith = _.template("<div><h1 class='header'><%= data.header %></h1><h2 class='header2'><%= data.header2 %></h2><h3 class='header3'><%= data.header3 %></h3><h4 class='header4'><%= data.header4 %></h4><h5 class='header5'><%= data.header5 %></h5><h6 class='header6'><%= data.header6 %></h6><ul class='list'><% for (var i = 0, l = data.list.length; i < l; i++) { %><li class='item'><%= data.list[i] %></li><% } %></ul></div>", null, {variable: 'data'});

  window.baseHtml = "<div><h1 class='header'></h1><h2 class='header2'></h2><h3 class='header3'></h3><h4 class='header4'></h4><h5 class='header5'></h5><h6 class='header6'></h6><ul class='list'><li class='item'></li></ul></div>";
 
window.doTtemplate = doT.template("<div><h1 class='header'>{{=it.header}}</h1><h2 class='header2'>{{=it.header2}}</h2><h3 class='header3'>{{=it.header3}}</h3><h4 class='header4'>{{=it.header4}}</h4><h5 class='header5'>{{=it.header5}}</h5><h6 class='header6'>{{=it.header6}}</h6><ul class='list'>{{for(var i = 0,l=it.list.length;i<l;i++) { }}<li class='item'>{{=it.list[i]}}</li>{{ } }}</ul></div>");

  
  //Resig Template Function (modified to support ')
  function tmpl(str) {
              var strFunc =
              "var p=[];" +
                          "with(obj){p.push('" +
  
              str.replace(/[\r\t\n]/g, " ")
                 .replace(/'(?=[^#]*#>)/g, "\t")
                 .split("'").join("\\'")
                 .split("\t").join("'")
                 .replace(/<#=(.+?)#>/g, "',$1,'")
                 .split("<#").join("');")
                 .split("#>").join("p.push('")
                 + "');}return p.join('');";
  
              return new Function("obj", strFunc);
          }
  
  window.resig = tmpl("<div><h1 class='header'><#= header #></h1><h2 class='header2'><#= header2 #></h2><h3 class='header3'><#= header3 #></h3><h4 class='header4'><#= header4 #></h4><h5 class='header5'><#= header5 #></h5><h6 class='header6'><#= header6 #></h6><ul class='list'><# for (var i = 0, l = list.length; i < l; i++) { #><li class='item'><#= list[i] #></li><# } #></ul></div>");
  
  //Resig modified template function (no "with" block)
  function tmpl2(str) {
              var strFunc =
              "var p=[];" +
                          "p.push('" +
  
              str.replace(/[\r\t\n]/g, " ")
                 .replace(/'(?=[^#]*#>)/g, "\t")
                 .split("'").join("\\'")
                 .split("\t").join("'")
                 .replace(/<#=(.+?)#>/g, "',$1,'")
                 .split("<#").join("');")
                 .split("#>").join("p.push('")
                 + "');return p.join('');";
  
              return new Function("data", strFunc);
          }
  
  window.resig2 = tmpl2("<div><h1 class='header'><#= data.header #></h1><h2 class='header2'><#= data.header2 #></h2><h3 class='header3'><#= data.header3 #></h3><h4 class='header4'><#= data.header4 #></h4><h5 class='header5'><#= data.header5 #></h5><h6 class='header6'><#= data.header6 #></h6><ul class='list'><# for (var i = 0, l = data.list.length; i < l; i++) { #><li class='item'><#= data.list[i] #></li><# } #></ul></div>");

  window.hoganTemplate = Hogan.compile("<div><h1 class='header'>{{{header}}}</h1><h2 class='header2'>{{{header2}}}</h2><h3 class='header3'>{{{header3}}}</h3><h4 class='header4'>{{{header4}}}</h4><h5 class='header5'>{{{header5}}}</h5><h6 class='header6'>{{{header6}}}</h6><ul class='list'>{{#list}}<li class='item'>{{{.}}}</li>{{/list}}</ul></div>");


  window.aroTemplate= aro.template.compile(
    "<div><h1 class='header'>#= data.header #</h1><h2 class='header2'>#= data.header2 #</h2><h3 class='header3'>#= data.header3 #</h3><h4 class='header4'>#= data.header4 #</h4><h5 class='header5'>#= data.header5 #</h5><h6 class='header6'>#= data.header6 #</h6><ul class='list'># for (var i = 0, l = data.list.length; i < l; i++) { #<li class='item'>#= data.list[i] #</li># } #</ul></div>",
    {
        opener:'#', 
        closer : '#'
    }
);
</script>

<div id="template" style="display:none"></div>
    

Preparation code output

<script src="https://raw.github.com/documentcloud/underscore/master/underscore.js"></script> <script src="http://ajax.cdnjs.com/ajax/libs/mustache.js/0.3.0/mustache.min.js"></script> <script src="https://github.com/downloads/wycats/handlebars.js/handlebars.1.0.0.beta.3.js"></script> <script src="http://cdn.kendostatic.com/2012.1.322/js/kendo.all.min.js"></script> <script src="http://jashkenas.github.com/coffee-script/extras/coffee-script.js"></script> <script src="http://borismoore.github.com/jsrender/jsrender.js"></script> <script src="https://raw.github.com/twitter/hogan.js/master/lib/template.js"></script> <script src="https://raw.github.com/twitter/hogan.js/master/lib/compiler.js"></script> <script src="https://github.com/olado/doT/raw/master/doT.js"> </script> <script> var aro = {}; aro.string = new function () { /** * @var {Object} */ this.escapes_html = { '\\': '&#92;', '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;', "/": '&#47;' }; /** * @var {RexExp} */ this.escape_html_reg = /[&<>"'\/\\]/g; /** * @param {String} string * @returns {String} */ this.escapeHtml = function(string) { return string.replace( this.escape_html_reg, function (match) { return aro.string.escapes_html[match]; } ); }; }; aro.template = new function() { /** * @var {String} */ this.opener = '<#', /** * @var {String} */ this.closer = '#>'; /** * Retourne le corp d'une fonction correspondante à un template * * @param {String} template * @param {Object} options * @returns {String} */ function transform(template, options) { var fn_body = 'var r=\'\';', code = false, code_op = 0,//1 == concat, 2 == concat + escape is_last_code_block = true, is_escape = false, char = '', from = 0, opener_chars = (options.opener || aro.template.opener).split(''), closer_chars = (options.closer || aro.template.closer).split(''), opener_chars_len = opener_chars.length, closer_chars_len = closer_chars.length, frag, j, to, l, char; source : for(to = 0, l = template.length - (closer_chars_len - 1); to < l; to++) { char = template[to]; //ouverture block code if(!code) { if(!is_escape && char === opener_chars[0]) { for(j = 1; j < opener_chars_len; j++) { if(opener_chars[j] !== template[to + j]) { continue source; } } code = true; if(from < to) { fn_body += (is_last_code_block ? 'r+=' : '+') + JSON.stringify(template.slice(from, to)); } to += opener_chars_len - 1; from = to; } } //code concat else if(!code_op && from === to - 1) {//alert(char); if(char === '=') { from++; code_op = 1; is_last_code_block = false; } else if(char === '-') { from++; code_op = 2; is_last_code_block = false; } else { code_op = 0; is_last_code_block = true; from && (fn_body += ';'); } } //fermeture block code else if(!is_escape && char === closer_chars[0]) { for(j = 1; j < closer_chars_len; j++) { if(closer_chars[j] !== template[to + j]) { continue source; } } if(from < to) { frag = template.slice(from + opener_chars_len, to);//alert(frag); fn_body += !code_op ? frag : (is_last_code_block ? 'r+=' : '+') + (code_op === 2 ? 'aro.string.escapeHtml(' + frag + ')' : '(' + frag + ')'); } code = false; code_op = 0; from = to + closer_chars_len; to = from; } is_escape = char === '\\'; } if(from < to - 1) { fn_body += (is_last_code_block ? 'r+=' : '+') + JSON.stringify(template.slice(from, to)) + ';'; } return fn_body += 'return r;'; } /** * Retourne la fonction correspondante au template sous forme de chaine * * @param {String} template * @param {Object} options * @param {String} name * @returns {String} */ this.getSource = function(template, options, name) { return 'function ' + (name || '') + '(data){' + transform(template, options || {}) + '}'; }; /** * Retourne la fonction correspondante au template * * @param {String} template * @param {Object} options * @returns {Function} */ this.compile = function(template, options) { return Function( 'data', transform(template, options || {}) ); }; }; </script> <!--External Template Definitions--> <script type="text/x-kendo-template" id="kendoUIextTemplate"> <div> <h1 class='header'>#= data.header #</h1> <h2 class='header2'>#= data.header2 #</h2> <h3 class='header3'>#= data.header3 #</h3> <h4 class='header4'>#= data.header4 #</h4> <h5 class='header5'>#= data.header5 #</h5> <h6 class='header6'>#= data.header6 #</h6> <ul class='list'> # for (var i = 0, l = data.list.length; i < l; i++) { # <li class='item'>#= data.list[i] #</li> # } # </ul> </div> </script> <script> window.sharedVariables = { header: "Header", header2: "Header2", header3: "Header3", header4: "Header4", header5: "Header5", header6: "Header6", list: ['1000000000', '2', '3', '4', '5', '6', '7', '8', '9', '10'] }; //JsRender compiled template (no encoding) window.jsRenderTemplate = $.templates("<div><h1 class='header'>{{:header}}</h1><h2 class='header2'>{{:header2}}</h2><h3 class='header3'>{{:header3}}</h3><h4 class='header4'>{{:header4}}</h4><h5 class='header5'>{{:header5}}</h5><h6 class='header6'>{{:header6}}</h6><ul class='list'>{{for list}}<li class='item'>{{:#data}}</li>{{/for}}</ul></div>"); window.mustacheTemplate = "<div><h1 class='header'>{{{header}}}</h1><h2 class='header2'>{{{header2}}}</h2><h3 class='header3'>{{{header3}}}</h3><h4 class='header4'>{{{header4}}}</h4><h5 class='header5'>{{{header5}}}</h5><h6 class='header6'>{{{header6}}}</h6><ul class='list'>{{#list}}<li class='item'>{{{.}}}</li>{{/list}}</ul></div>"; window.handlebarsTemplate = Handlebars.compile("<div><h1 class='header'>{{header}}</h1><h2 class='header2'>{{header2}}</h2><h3 class='header3'>{{header3}}</h3><h4 class='header4'>{{header4}}</h4><h5 class='header5'>{{header5}}</h5><h6 class='header6'>{{header6}}</h6><ul class='list'>{{#each list}}<li class='item'>{{this}}</li>{{/each}}</ul></div>"); window.kendouiTemplate = kendo.template("<div><h1 class='header'>#= data.header #</h1><h2 class='header2'>#= data.header2 #</h2><h3 class='header3'>#= data.header3 #</h3><h4 class='header4'>#= data.header4 #</h4><h5 class='header5'>#= data.header5 #</h5><h6 class='header6'>#= data.header6 #</h6><ul class='list'># for (var i = 0, l = data.list.length; i < l; i++) { #<li class='item'>#= data.list[i] #</li># } #</ul></div>", {useWithBlock:true}); window.kendouiTemplate2 = kendo.template("<div><h1 class='header'>#= data.header #</h1><h2 class='header2'>#= data.header2 #</h2><h3 class='header3'>#= data.header3 #</h3><h4 class='header4'>#= data.header4 #</h4><h5 class='header5'>#= data.header5 #</h5><h6 class='header6'>#= data.header6 #</h6><ul class='list'># for (var i = 0, l = data.list.length; i < l; i++) { #<li class='item'>#= data.list[i] #</li># } #</ul></div>", {useWithBlock:false}); //Use external template definition window.kendoUIAlt = kendo.template($("#kendoUIextTemplate").html()); window.kendoUIAlt2 = kendo.template($("#kendoUIextTemplate").html(), {useWithBlock:false}); window.underscoreTemplate = _.template("<div><h1 class='header'><%= header %></h1><h2 class='header2'><%= header2 %></h2><h3 class='header3'><%= header3 %></h3><h4 class='header4'><%= header4 %></h4><h5 class='header5'><%= header5 %></h5><h6 class='header6'><%= header6 %></h6><ul class='list'><% for (var i = 0, l = list.length; i < l; i++) { %><li class='item'><%= list[i] %></li><% } %></ul></div>"); window.underscoreTemplateNoWith = _.template("<div><h1 class='header'><%= data.header %></h1><h2 class='header2'><%= data.header2 %></h2><h3 class='header3'><%= data.header3 %></h3><h4 class='header4'><%= data.header4 %></h4><h5 class='header5'><%= data.header5 %></h5><h6 class='header6'><%= data.header6 %></h6><ul class='list'><% for (var i = 0, l = data.list.length; i < l; i++) { %><li class='item'><%= data.list[i] %></li><% } %></ul></div>", null, {variable: 'data'}); window.baseHtml = "<div><h1 class='header'></h1><h2 class='header2'></h2><h3 class='header3'></h3><h4 class='header4'></h4><h5 class='header5'></h5><h6 class='header6'></h6><ul class='list'><li class='item'></li></ul></div>"; window.doTtemplate = doT.template("<div><h1 class='header'>{{=it.header}}</h1><h2 class='header2'>{{=it.header2}}</h2><h3 class='header3'>{{=it.header3}}</h3><h4 class='header4'>{{=it.header4}}</h4><h5 class='header5'>{{=it.header5}}</h5><h6 class='header6'>{{=it.header6}}</h6><ul class='list'>{{for(var i = 0,l=it.list.length;i<l;i++) { }}<li class='item'>{{=it.list[i]}}</li>{{ } }}</ul></div>"); //Resig Template Function (modified to support ') function tmpl(str) { var strFunc = "var p=[];" + "with(obj){p.push('" + str.replace(/[\r\t\n]/g, " ") .replace(/'(?=[^#]*#>)/g, "\t") .split("'").join("\\'") .split("\t").join("'") .replace(/<#=(.+?)#>/g, "',$1,'") .split("<#").join("');") .split("#>").join("p.push('") + "');}return p.join('');"; return new Function("obj", strFunc); } window.resig = tmpl("<div><h1 class='header'><#= header #></h1><h2 class='header2'><#= header2 #></h2><h3 class='header3'><#= header3 #></h3><h4 class='header4'><#= header4 #></h4><h5 class='header5'><#= header5 #></h5><h6 class='header6'><#= header6 #></h6><ul class='list'><# for (var i = 0, l = list.length; i < l; i++) { #><li class='item'><#= list[i] #></li><# } #></ul></div>"); //Resig modified template function (no "with" block) function tmpl2(str) { var strFunc = "var p=[];" + "p.push('" + str.replace(/[\r\t\n]/g, " ") .replace(/'(?=[^#]*#>)/g, "\t") .split("'").join("\\'") .split("\t").join("'") .replace(/<#=(.+?)#>/g, "',$1,'") .split("<#").join("');") .split("#>").join("p.push('") + "');return p.join('');"; return new Function("data", strFunc); } window.resig2 = tmpl2("<div><h1 class='header'><#= data.header #></h1><h2 class='header2'><#= data.header2 #></h2><h3 class='header3'><#= data.header3 #></h3><h4 class='header4'><#= data.header4 #></h4><h5 class='header5'><#= data.header5 #></h5><h6 class='header6'><#= data.header6 #></h6><ul class='list'><# for (var i = 0, l = data.list.length; i < l; i++) { #><li class='item'><#= data.list[i] #></li><# } #></ul></div>"); window.hoganTemplate = Hogan.compile("<div><h1 class='header'>{{{header}}}</h1><h2 class='header2'>{{{header2}}}</h2><h3 class='header3'>{{{header3}}}</h3><h4 class='header4'>{{{header4}}}</h4><h5 class='header5'>{{{header5}}}</h5><h6 class='header6'>{{{header6}}}</h6><ul class='list'>{{#list}}<li class='item'>{{{.}}}</li>{{/list}}</ul></div>"); window.aroTemplate= aro.template.compile( "<div><h1 class='header'>#= data.header #</h1><h2 class='header2'>#= data.header2 #</h2><h3 class='header3'>#= data.header3 #</h3><h4 class='header4'>#= data.header4 #</h4><h5 class='header5'>#= data.header5 #</h5><h6 class='header6'>#= data.header6 #</h6><ul class='list'># for (var i = 0, l = data.list.length; i < l; i++) { #<li class='item'>#= data.list[i] #</li># } #</ul></div>", { opener:'#', closer : '#' } ); </script> <div id="template" style="display:none"></div>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in CCBot 2.0.0 / Other 0.0.0
Test Ops/sec
doT.js
doTtemplate(sharedVariables);
pending…
Kendo UI Templates (Default)
kendouiTemplate(sharedVariables);
pending…
Kendo UI Templates (No "with" block)
kendouiTemplate2(sharedVariables);
pending…
Handlebars.js
handlebarsTemplate(sharedVariables);
pending…
Underscore.js Template
underscoreTemplate(sharedVariables);
pending…
Resig Micro Templates (modified)
resig(sharedVariables);
pending…
Resig Micro Templates (No "with" block)
resig2(sharedVariables);
pending…
Underscore.js Template (No "with")
underscoreTemplateNoWith(sharedVariables);
pending…
Hogan.js
hoganTemplate.render(sharedVariables);
pending…
JsRender
jsRenderTemplate.render(sharedVariables);
pending…
Mustache.js Template
Mustache.to_html(mustacheTemplate, sharedVariables);
pending…
aro
aroTemplate(sharedVariables);
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL.

0 Comments