jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
To test performance of jQuery template for outputting 100 rows each with 10 columns where the columns have fields that can trigger events.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js">
</script>
<script src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.js">
</script>
<script src="http://documentcloud.github.com/underscore/underscore-min.js">
</script>
<script src="http://github.com/janl/mustache.js/raw/master/mustache.js">
</script>
<script src="https://raw.github.com/BorisMoore/jsrender/master/jsrender.js">
</script>
<script src="https://github.com/andyet/ICanHaz.js/raw/master/ICanHaz.min.js">
</script>
<script src="http://github.com/pvande/Milk/raw/master/dist/v1.2.0/milk.js">
</script>
<script src="http://dl.dropbox.com/u/426176/js/swig/swig.js">
</script>
<script src="http://cloud.github.com/downloads/wycats/handlebars.js/handlebars-1.0.0.beta.6.js" type="text/javascript"></script>
<script>
$(function() {
$('body').delegate('#table .edit a, #table .select a', 'click', function() {
var $td = $(this).closest('td');
$td.find('input, select').show();
$td.find('a').hide();
});
$('body').delegate('#table .edit .cancel, $table .select .cancel', 'click', function() {
var $td = $(this).closest('td');
$td.find('input, select').hide();
$td.find('a').show();
});
});
</script>
<script type="text/x-jquery-tmpl" id="tmplRow">
< tr > < td > < input type = "checkbox"
value = "${id}" / > < /td>
<td>${firstName} ${lastName}</td > < td class = "edit" > < a > Edit < /a>
<input style="display:none;" type="hidden" value="Blah" / > < input class = "cancel"
type = "button"
value = "cancel" / > < /td>
<td class="select">
<a>Select</a > < select style = "display:none;" > < option > 0 < /option>
<option>1</option > < option > 2 < /option>
<option>3</option > < option > 4 < /option>
<option>5</option > < option > 6 < /option>
<option>7</option > < option > 8 < /option>
<option>9</option > < option > 10 < /option>
</select > < input class = "cancel"
type = "button"
value = "cancel" / > < /td>
<td>More string</td > < td > More string < /td>
<td>More string</td > < td > More string < /td>
<td>More string</td > < td > More string < /td>
</tr >
</script>
<script type="text/x-handlebars-template" id="handlebarsTmpl">
{{#each rows}}
{{#with this}}
< tr > < td > < input type = "checkbox"
value = "{{id}}" / > < /td>
<td>{{firstName}} {{lastName}}</td > < td class = "edit" > < a > Edit < /a>
<input style="display:none;" type="hidden" value="Blah" / > < input class = "cancel"
type = "button"
value = "cancel" / > < /td>
<td class="select">
<a>Select</a > < select style = "display:none;" > < option > 0 < /option>
<option>1</option > < option > 2 < /option>
<option>3</option > < option > 4 < /option>
<option>5</option > < option > 6 < /option>
<option>7</option > < option > 8 < /option>
<option>9</option > < option > 10 < /option>
</select > < input class = "cancel"
type = "button"
value = "cancel" / > < /td>
<td>More string</td > < td > More string < /td>
<td>More string</td > < td > More string < /td>
<td>More string</td > < td > More string < /td>
</tr >
{{/with}}
{{/each}}
</script>
<script type="text/html" id="icanhazTmpl">
{{#rows}}
< tr > < td > < input type = "checkbox"
value = "{{id}}" / > < /td>
<td>{{firstName}} {{lastName}}</td > < td class = "edit" > < a > Edit < /a>
<input style="display:none;" type="hidden" value="Blah" / > < input class = "cancel"
type = "button"
value = "cancel" / > < /td>
<td class="select">
<a>Select</a > < select style = "display:none;" > < option > 0 < /option>
<option>1</option > < option > 2 < /option>
<option>3</option > < option > 4 < /option>
<option>5</option > < option > 6 < /option>
<option>7</option > < option > 8 < /option>
<option>9</option > < option > 10 < /option>
</select > < input class = "cancel"
type = "button"
value = "cancel" / > < /td>
<td>More string</td > < td > More string < /td>
<td>More string</td > < td > More string < /td>
<td>More string</td > < td > More string < /td>
</tr >
{{/rows}}
</script>
<script type="text/template" id="swigTmpl">
{% for row in rows %}
<tr>
<td><input type="checkbox" value="{{ row.id }}" />< /td>
<td>{{ row.firstName }} {{ row.lastName }}</td>
<td class="edit">
<a>Edit</a>
<input style="display:none;" type="hidden" value="Blah" />
<input class="cancel" type="button" value="cancel" />
</td>
<td class="select">
<a>Select</a >
<select style="display:none;">
<option>0</option>
<option>1</option><option>2</option>
<option>3</option><option>4</option>
<option>5</option><option>6</option>
<option>7</option><option>8</option>
<option>9</option><option>10</option>
</select >
<input class="cancel" type="button" value="cancel" />
</td>
<td>More string</td><td>More string</td>
<td>More string</td><td>More string</td>
<td>More string</td><td>More string</td>
</tr>
{% endfor %}
</script>
<script>
var data = [];
for (var i = 0; i < 100; i++) {
var row = {
id: i,
firstName: 'john',
lastName: 'doe'
};
data.push(row);
}
$.template("savedTmpl", document.getElementById("tmplRow").innerHTML);
var underscoreTmpl = "\
<%for(var i=0;i<rows.length;i++){%>\
<%var row=rows[i];%> \
<tr> \
<td> <input type = 'checkbox' value = '<%= row.id%>' /> </td>\
<td><%= row.firstname%> <%= row.lastname%></td> \
<td class = 'edit'> \
<a> Edit </a>\
<input style='display:none;' type='hidden' value='Blah' /> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td class='select'>\
<a>Select</a> \
<select style = 'display:none;'> \
<option>0</option>\
<option>1</option> \
<option>2</option>\
<option>3</option> \
<option>4</option>\
<option>5</option> \
<option>6</option>\
<option>7</option> \
<option>8</option>\
<option>9</option> \
<option>10</option>\
</select> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
</tr ><%}%>";
var underscoreCompiled = _.template( underscoreTmpl );
var mustacheTmpl = "\
{{#rows}}\
<tr> \
<td> <input type = 'checkbox' value = '{{id}}' /> </td>\
<td>{{firstname}} {{lastname}}</td> \
<td class = 'edit'> \
<a> Edit </a>\
<input style='display:none;' type='hidden' value='Blah' /> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td class='select'>\
<a>Select</a> \
<select style = 'display:none;'> \
<option>0</option>\
<option>1</option> \
<option>2</option>\
<option>3</option> \
<option>4</option>\
<option>5</option> \
<option>6</option>\
<option>7</option> \
<option>8</option>\
<option>9</option> \
<option>10</option>\
</select> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
</tr >{{/rows}}"
var milkTmpl = "\
{{#rows}}\
<tr> \
<td> <input type = 'checkbox' value = '{{id}}' /> </td>\
<td>{{firstname}} {{lastname}}</td> \
<td class = 'edit'> \
<a> Edit </a>\
<input style='display:none;' type='hidden' value='Blah' /> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td class='select'>\
<a>Select</a> \
<select style = 'display:none;'> \
<option>0</option>\
<option>1</option> \
<option>2</option>\
<option>3</option> \
<option>4</option>\
<option>5</option> \
<option>6</option>\
<option>7</option> \
<option>8</option>\
<option>9</option> \
<option>10</option>\
</select> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
</tr >{{/rows}}"
var jsRenderTmpl = "\
<tr> \
<td> <input type = 'checkbox' value = '{{=id}}' /> </td>\
<td>{{=firstname}} {{=lastname}}</td> \
<td class = 'edit'> \
<a> Edit </a>\
<input style='display:none;' type='hidden' value='Blah' /> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td class='select'>\
<a>Select</a> \
<select style = 'display:none;'> \
<option>0</option>\
<option>1</option> \
<option>2</option>\
<option>3</option> \
<option>4</option>\
<option>5</option> \
<option>6</option>\
<option>7</option> \
<option>8</option>\
<option>9</option> \
<option>10</option>\
</select> \
<input class = 'cancel' type = 'button' value = 'cancel' /> \
</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
<td>More string</td> \
<td>More string</td>\
</tr >";
var handlebarsTmpl = Handlebars.compile($("#handlebarsTmpl").html());
(function(){return this.HandlebarsTemplates||(this.HandlebarsTemplates={}),this.HandlebarsTemplates.handlebarsCompiled=Handlebars.template(function(e,t,n,r,i){function l(e,t){var r="",i;r+="\n",i=n["with"].call(e,e,{hash:{},inverse:f.noop,fn:f.program(2,c,t)});if(i||i===0)r+=i;return r+="\n",r}function c(e,t){var r="",i,s;return r+='\n< tr > < td > < input type = "checkbox"\n value = "',s=n.id,s?i=s.call(e,{hash:{}}):(i=e.id,i=typeof i===u?i():i),r+=a(i)+'" / > < /td>\n <td>',s=n.firstName,s?i=s.call(e,{hash:{}}):(i=e.firstName,i=typeof i===u?i():i),r+=a(i)+" ",s=n.lastName,s?i=s.call(e,{hash:{}}):(i=e.lastName,i=typeof i===u?i():i),r+=a(i)+'</td > < td class = "edit" > < a > Edit < /a>\n <input style="display:none;" type="hidden" value="Blah" / > < input class = "cancel"\n type = "button"\n value = "cancel" / > < /td>\n <td class="select">\n <a>Select</a > < select style = "display:none;" > < option > 0 < /option>\n <option>1</option > < option > 2 < /option>\n <option>3</option > < option > 4 < /option>\n <option>5</option > < option > 6 < /option>\n <option>7</option > < option > 8 < /option>\n <option>9</option > < option > 10 < /option>\n </select > < input class = "cancel"\n type = "button"\n value = "cancel" / > < /td>\n <td>More string</td > < td > More string < /td>\n <td>More string</td > < td > More string < /td>\n <td>More string</td > < td > More string < /td>\n</tr >\n',r}n=n||e.helpers;var s="",o,u="function",a=this.escapeExpression,f=this;o=t.rows,o=n.each.call(t,o,{hash:{},inverse:f.noop,fn:f.program(1,l,i)});if(o||o===0)s+=o;return s+="\n",s}),this.HandlebarsTemplates.handlebarsCompiled}).call(this);
swig.init({
autoescape: false,
cache: true,
filters: {}
});
var swigTmpl = swig.compile($("#swigTmpl").html());
</script>
Ready to run.
Test | Ops/sec | |
---|---|---|
jQuery templates |
| ready |
Precompiled jQuery template |
| ready |
Underscore.js |
| ready |
mustache js |
| ready |
ICanHaz.js |
| ready |
Handlebars.js |
| ready |
Milk |
| ready |
swig |
| ready |
handlebars precompiled |
| ready |
underscore precompiled |
| ready |
handlebars2 |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.