Mustache style template engine perf (v5)

Revision 5 of this benchmark created on


Description

LT

Mustache.js

Handlebars.js

templayed.js

Hogan.js

Preparation HTML

<script src="https://rawgithub.com/rhyzx/lt/master/lt.js"></script>
<script src="https://rawgithub.com/janl/mustache.js/master/mustache.js"></script>
<script src="https://github.com/downloads/wycats/handlebars.js/handlebars-1.0.rc.1.min.js"></script>
<script src="https://rawgithub.com/archan937/templayed.js/master/src/templayed.js"></script>
<script src="https://rawgithub.com/twitter/hogan.js/master/web/1.0.0/hogan.min.js"></script>
<script src="https://rawgithub.com/akdubya/dustjs/master/dist/dust-full-0.3.0.min.js"></script>

Setup

var bench = [{ // non
        source: 'Hello world',
        data: {}
    }, { // basic
        source: 'Hello {{name}}! You have {{count}} new messages.',
        data:   { name: 'Mick', count: 30 }
    }, { // if
        source: '{{#check}}pass{{/check}}',
        data:   { check: true }
    }, { // use obj
        source: '{{#person}}{{name}}{{age}}{{/person}}',
        data:   { person: { name: 'Larry', age: 45 } }
    }, { // iterator list
        source: '{{#names}}{{name}}{{/names}}',
        data:   { names: [{name: 'Moe'}, {name: 'Larry'}, {name: 'Curly'}, {name: 'Shemp'}] }
    }, { // invert
        source: '{{^not}}show me the money{{/not}}',
        data:   { not: false }
    }, { // complex
        source: (function () {/*
            <header>{{header}}</header>
            <ul>
            {{#items}}
                <li>{{name}} : {{value}}</li>
            {{/items}}
            </ul>
            {{#footer}}
            <footer>{{footer}}</footer>
            {{/footer}}
        */}).toString().slice(16, -4),
        data:   { header: 'this is header', items: [
            {name: 'a'}, {name: 'b'}, {name: 'c'}, {name: 'd'}, {name: 'e'},
            {name: 'a'}, {name: 'b'}, {name: 'c'}, {name: 'd'}, {name: 'e'},
            {name: 'a'}, {name: 'b'}, {name: 'c'}, {name: 'd'}, {name: 'e'}
        ]}
    }]
    
    // pre-compile
    for (var i=0, len=bench.length; i<len; i++) {
        var item = bench[i]
        item.lt = lt.compile(item.source)
        item.hogan = Hogan.compile(item.source)
    //    item.mustache = Mustache.parse(item.source)
        item.handlebars = Handlebars.compile(item.source)
    //    item.handlebars({}) // disable Handlebar lazy-compile
    //    item.templayed = templayed(item.source)
    }

Test runner

Ready to run.

Testing in
TestOps/sec
#Hogan.js
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = Hogan.compile(item.source).render(item.data)
}
ready
#Mustache
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = Mustache.render(item.source, item.data)
    // mustache will cache compiled tempate
    //Mustache.clearCache()
}
ready
#Handlebars
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    // Handlebars #compile will not compile template until render called
    item.result = Handlebars.compile(item.source)(item.data)
}
ready
#Templayed
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = templayed(item.source)(item.data)
}
ready
#LT
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = lt.compile(item.source).render(item.data)
}
ready
#LT - precompiled
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.lt.render(item.data)
}
ready
#Hogan.js - precompiled
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.hogan.render(item.data)
}
ready
#Dust.js
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    dust.compile(item.source, "test"+i);
    item.result = dust.render('intro'+i, item.data, function(err, out) {});
}
ready
Handlebars.js precompiled
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.handlebars(item.data)
}
ready

Revisions

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