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
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
<script type="text/javascript" src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<div id="dom-creation" style="display: none;">container for creating nodes with innerHTML</div>
<script id="template" type="text/html">
<table>
<% $.each(models, function(i, model) { %>
<tr>
<td><%- model.prop1 %></td>
<td><%- model.prop2 %></td>
<td><%- model.prop3 %></td>
<td><%- model.prop4 %></td>
<td><%- model.prop5 %></td>
</tr>
<% }); %>
</table>
</script>
<script id="template-no-with" type="text/html">
<table>
<% $.each(obj.models, function(i, model) { %>
<tr>
<td><%- model.prop1 %></td>
<td><%- model.prop2 %></td>
<td><%- model.prop3 %></td>
<td><%- model.prop4 %></td>
<td><%- model.prop5 %></td>
</tr>
<% }); %>
</table>
</script>
_.templateNoWith = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.escape || noMatch, function(match, code) {
return "',_.escape(" + unescape(code) + "),'";
})
.replace(c.interpolate || noMatch, function(match, code) {
return "'," + unescape(code) + ",'";
})
.replace(c.evaluate || noMatch, function(match, code) {
return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
+ "');return __p.join('');";
var func = new Function('obj', '_', tmpl);
if (data) return func(data, _);
return function(data) {
return func.call(this, data, _);
};
};
var models = [];
var modelsHtml = [];
for (var i = 0; i < 250; i++) {
var model = {
prop1: 'prop1-' + i,
prop2: 'prop2-' + i,
prop3: 'prop3-' + i,
prop4: 'prop4-' + i,
prop5: 'prop5-' + i
};
models.push(model);
modelsHtml.push(
'<tr>' +
'<td>' + model.prop1 + '</td>' +
'<td>' + model.prop2 + '</td>' +
'<td>' + model.prop3 + '</td>' +
'<td>' + model.prop4 + '</td>' +
'<td>' + model.prop5 + '</td>' +
'</tr>'
);
}
var models25 = models.slice(0, 25);
var models50 = models.slice(0, 50);
var models75 = models.slice(0, 75);
var models100 = models.slice(0, 100);
var models150 = models.slice(0, 150);
var models200 = models.slice(0, 200);
var models250 = models.slice(0, 250);
var tableHtml25 = '<table>' + modelsHtml.slice(0, 25).join('') + '</table>';
var tableHtml50 = '<table>' + modelsHtml.slice(0, 50).join('') + '</table>';
var tableHtml75 = '<table>' + modelsHtml.slice(0, 75).join('') + '</table>';
var tableHtml100 = '<table>' + modelsHtml.slice(0, 100).join('') + '</table>';
var tableHtml150 = '<table>' + modelsHtml.slice(0, 150).join('') + '</table>';
var tableHtml200 = '<table>' + modelsHtml.slice(0, 200).join('') + '</table>';
var tableHtml250 = '<table>' + modelsHtml.slice(0, 250).join('') + '</table>';
var domCreation = document.getElementById('dom-creation');
var template = _.template(document.getElementById('template').innerHTML);
var templateNoWith = _.templateNoWith(document.getElementById('template-no-with').innerHTML);
Ready to run.
Test | Ops/sec | |
---|---|---|
innerHtml 150 rows |
| ready |
createElement 150 rows |
| ready |
underscore.js 150 rows |
| ready |
underscore.js no with 150 rows |
| ready |
jQuery 150 rows |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.