Hogan vs DoT.js vs TrimPath vs Handlebars vs Underscore (compile+render)
JavaScript performance comparison
Revision 3 of this test case created by axt on 12th December 2012
Preparation code
<script src = "http://twitter.github.com/hogan.js/builds/2.0.0/hogan-2.0.0.js" > </ script > <script src = "https://raw.github.com/mgutz/doT/master/doT.min.js" > </ script > <script src = "http://trimpath.googlecode.com/files/trimpath-template-1.0.38.js" > </ script > <script src = "http://cloud.github.com/downloads/wycats/handlebars.js/handlebars-1.0.0.beta.6.js" > </ script > <script src = "http://underscorejs.org/underscore-min.js" > </ 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' ] } ; window.templateDiv = document.getElementById ( "template" ) ; </ 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.
To run the tests, please enable JavaScript and reload the page.
Testing in unknown unknown
Test
Ops/sec
Hogan
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>" ) ; templateDiv.innerHTML = hoganTemplate.render ( sharedVariables) ;
pending…
doT
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>" ) ; templateDiv.innerHTML = doTTemplate( sharedVariables) ;
pending…
TrimPath
window.trimpathTemplate = TrimPath.parseTemplate ( "<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 i in list}<li class='item'>${i}</li>{/for}</ul></div>" ) ; templateDiv.innerHTML = trimpathTemplate.process ( sharedVariables) ;
pending…
Handlerbars
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'>{{#list}}<li class='item'>{{{.}}}</li>{{/list}}</ul></div>" ) ; templateDiv.innerHTML = handlebarsTemplate( sharedVariables) ;
pending…
Underscore
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'><% _.each(list, function(name) { %><li class='item'><%= name %></li><% }); %></ul></div>" ) ; templateDiv.innerHTML = underscoreTemplate( sharedVariables) ;
pending…
Compare results of other browsers
1 comment
This is an incorrect comparison don't take it seriously because Hogan is using caching and doT allows to handle caching manually. For better comparison look into http://jsperf.com/hogan-vs-dot-js/2 for better doT vs Hogan test.