Mustache style template engine perf (v3)

Revision 3 of this benchmark created on


Description

LT

Mustache.js

Handlebars.js

templayed.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>

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.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
compile#LT
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.lt = lt.compile(item.source)
}
ready
compile#Mustache
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.mustache = Mustache. parse(item.source)
    // mustache will cache compiled tempate
    Mustache.clearCache()
}
ready
compile#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.handlebars = Handlebars.template(Handlebars.precompile(item.source))
}
ready
compile#Templayed
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.templayed = templayed(item.source)
}
ready
render#LT
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.lt(item.data)
}
ready
render#Mustache
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.mustache(item.data)
}
ready
render#Handlebars
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.handlebars(item.data)
}
ready
render#Templayed
for (var i=0, len=bench.length; i<len; i++) {
    var item = bench[i]
    item.result = item.templayed(item.data)
}
 
ready

Revisions

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