Handlebars.js vs Mustache.js (v33)

Revision 33 of this benchmark created on


Preparation HTML

<style type="text/css">
#output { overflow: hidden; }
#output .sample { width: 45%; padding: 1%; border: 1px solid #ccc; float: left; }
</style>
<script src="//cdnjs.cloudflare.com/ajax/libs/mustache.js/0.7.2/mustache.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0/handlebars.min.js"></script>
<script id="template_one" type="text/template">
<h3>{{header}}</h3>
<ul>
    {{#items}}
        {{#first}}<li><strong>{{name}}</strong></li>{{/first}}
        {{^first}}<li>{{#link}}<a href="{{url}}">{{/link}}{{name}}{{#link}}</a>{{/link}}</li>{{/first}}
    {{/items}}
</ul>
{{#double}}
    <p>Double rainbow!</p>
{{/double}}
</script>
<script id="template_line" type="text/template">
      <li>{{#link}}<a href="{{url}}">{{/link}}{{name}}{{#link}}</a>{{/link}}</li>
</script>
<div id="output">
    <div class="sample">
        <h2>Mustache Renders</h2>
        <div id="mu"></div>
    </div>
    <div class="sample">
        <h2>Handlebars Renders</h2>
        <div id="hb"></div>
    </div>
</div>
<script>
  var mcl_compiled=null,mclresult="", template_line = document.getElementById('template_line').innerText,
template = document.getElementById('template_one').innerText,
      data = {
          "header": "Colors",
          "items": [
              { "name": "rainbow", "first": true, "url": "#Rainbow" },
              { "name": "red", "link": true, "url": "#Red" },
              { "name": "orange", "link": true, "url": "#Orange" },
              { "name": "yellow", "link": true, "url": "#Yellow" },
              { "name": "green", "link": true, "url": "#Green" },
              { "name": "blue", "link": true, "url": "#Blue" },
              { "name": "purple", "link": true, "url": "#Purple" },
              { "name": "white", "link": false, "url": "#While" },
              { "name": "black", "link": false, "url": "#Black" },
              { "name": "rainbow", "first": true, "url": "#Rainbow" },
              { "name": "red", "link": true, "url": "#Red" },
              { "name": "orange", "link": true, "url": "#Orange" },
              { "name": "yellow", "link": true, "url": "#Yellow" },
              { "name": "green", "link": true, "url": "#Green" },
              { "name": "blue", "link": true, "url": "#Blue" },
              { "name": "purple", "link": true, "url": "#Purple" },
              { "name": "white", "link": false, "url": "#While" },
              { "name": "black", "link": false, "url": "#Black" },
              { "name": "rainbow", "first": true, "url": "#Rainbow" },
              { "name": "red", "link": true, "url": "#Red" },
              { "name": "orange", "link": true, "url": "#Orange" },
              { "name": "yellow", "link": true, "url": "#Yellow" },
              { "name": "green", "link": true, "url": "#Green" },
              { "name": "blue", "link": true, "url": "#Blue" },
              { "name": "purple", "link": true, "url": "#Purple" },
              { "name": "white", "link": false, "url": "#While" },
              { "name": "black", "link": false, "url": "#Black" },
              { "name": "rainbow", "first": true, "url": "#Rainbow" },
              { "name": "red", "link": true, "url": "#Red" },
              { "name": "orange", "link": true, "url": "#Orange" },
              { "name": "yellow", "link": true, "url": "#Yellow" },
              { "name": "green", "link": true, "url": "#Green" },
              { "name": "blue", "link": true, "url": "#Blue" },
              { "name": "purple", "link": true, "url": "#Purple" },
              { "name": "white", "link": false, "url": "#While" },
              { "name": "black", "link": false, "url": "#Black" }
          ],
          "double": true
      },
      hb_compiled,
      mc_compiled;
  
  ui.benchmarks[1].setup = function() {
      hb_compiled = null;
      mc_compiled = null;
  };
  
  ui.benchmarks[2].setup = function() {
      hb_compiled = Handlebars.compile(template);
      Mustache.clearCache();
      mc_compiled = Mustache.compile(template);
  };
  
  document.getElementById('mu').innerHTML = Mustache.to_html(template, data);
  document.getElementById('hb').innerHTML = Handlebars.compile(template)(data);
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Handlebars: compile + render
Handlebars.compile(template)(data);
ready
Mustache: compile + render
Mustache.clearCache();
Mustache.compile(template)(data);
ready
Mustache: to_html
Mustache.clearCache();
Mustache.to_html(template, data);
ready
Handlebars: compile once + render
if (!hb_compiled) {
  hb_compiled = Handlebars.compile(template);
}
hb_compiled(data);
ready
Mustache: compile once + render
if (!mc_compiled) {
  Mustache.clearCache();
  mc_compiled = Mustache.compile(template);
}
mc_compiled(data);
ready
Handlebars: render only
hb_compiled(data);
ready
Mustache: render only
mc_compiled(data);
ready
Line Loop mc
if (!mcl_compiled) {
  Mustache.clearCache();
  mcl_compiled = Mustache.compile(template_line);
}
mclresult="";
for (i = 0; i < data.items.length; i++) {
  mclresult += mcl_compiled(data.items[i]);
}
ready

Revisions

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