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="//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="https://raw.github.com/janl/mustache.js/master/mustache.js">
</script>
<script src="https://raw.github.com/BorisMoore/jsrender/master/jsrender.js">
</script>
<script src="https://raw.github.com/HenrikJoreteg/ICanHaz.js/master/ICanHaz.min.js">
</script>
<script src="http://raw.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 type="text/javascript">
$(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 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 |
You can edit these tests or add more tests to this page by appending /edit to the URL.