Underscore templates - classic vs. precompiled

JavaScript performance comparison

Revision 7 of this test case created by

Preparation code

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.0-rc.2/lodash.min.js"></script>

<script>
  var lodash = _.noConflict();
</script>

      
<script>
Benchmark.prototype.setup = function() {
  var _ = window.lodash;
  
  var template = '<div class="item <%= id %>">' +
                 '  <h1><%= title %></h1>' +
                 '  <p><%= desc %></p>' +
                 '  <ul class="attributes">' +
                 '    <li><%= attrs.dimensions %></li>' +
                 '    <li><%= attrs.weight %></li>' +
                 '    <li><%= attrs.price %></li>' +
                 '  </ul>' +
                 '</div>';
  var templateNoWith = '<div class="item <%= data.id %>">' +
                 '  <h1><%= data.title %></h1>' +
                 '  <p><%= data.desc %></p>' +
                 '  <ul class="attributes">' +
                 '    <li><%= data.attrs.dimensions %></li>' +
                 '    <li><%= data.attrs.weight %></li>' +
                 '    <li><%= data.attrs.price %></li>' +
                 '  </ul>' +
                 '</div>';
  
  var templateFuncPrecompiled = eval("(" + _.template(template).source + ")");
  var templateFuncPrecompiledNoWith = eval("(" + _.template(templateNoWith,null,{ 'variable': 'data' }).source + ")");
  
  var classicCompiled = _.template(template);
  var classicCompiledNoWith = _.template(templateNoWith, null, { 'variable': 'data' });

};
</script>

Preparation code output

<script> var lodash = _.noConflict(); </script>

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
classic
var output = _.template(template, {               // render template
  id: 5,
  title : 'Hello World!',
  desc  : 'Ordianry item',
  attrs : {
    dimensions : '100cm x 100cm x 20cm',
    weight     : '15kg',
    price      : '10EUR'
  }
});
pending…
precompiled
var output = templateFuncPrecompiled({  // render template
  id: 5,
  title : 'Hello World!',
  desc  : 'Ordianry item',
  attrs : {
    dimensions : '100cm x 100cm x 20cm',
    weight     : '15kg',
    price      : '10EUR'
  }
});
pending…
NoWith
var output = templateFuncPrecompiledNoWith({  // render template
  id: 5,
  title : 'Hello World!',
  desc  : 'Ordianry item',
  attrs : {
    dimensions : '100cm x 100cm x 20cm',
    weight     : '15kg',
    price      : '10EUR'
  }
});
pending…
classic no with
var output = _.template(templateNoWith, {               // render template
  id: 5,
  title : 'Hello World!',
  desc  : 'Ordinary item',
  attrs : {
    dimensions : '100cm x 100cm x 20cm',
    weight     : '15kg',
    price      : '10EUR'
  }
}, {variable: 'data'});
pending…
classic compiled
var output = classicCompiled({               // render template
  id: 5,
  title : 'Hello World!',
  desc  : 'Ordianry item',
  attrs : {
    dimensions : '100cm x 100cm x 20cm',
    weight     : '15kg',
    price      : '10EUR'
  }
});
pending…
classic compiled no with
var output = classicCompiledNoWith({               // render template
  id: 5,
  title : 'Hello World!',
  desc  : 'Ordianry item',
  attrs : {
    dimensions : '100cm x 100cm x 20cm',
    weight     : '15kg',
    price      : '10EUR'
  }
});
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