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
<div id='content'></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/0.7.2/mustache.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/hogan.js/3.0.0/hogan.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0-alpha.1/handlebars.min.js"></script>
<script src="https://g.tbcdn.cn/kissy/k/1.4.2/??seed-min.js"></script>
var context = {
messages: [
{ greeting: "Hello", subject: "World" },
{ greeting: "What's up", subject: "Dan" },
{ greeting: "How's it going", subject: "Ben?" },
{ greeting: "Hello", subject: "World" },
{ greeting: "What's up", subject: "Dan" },
{ greeting: "How's it going", subject: "Ben?" },
{ greeting: "Hello", subject: "World" },
{ greeting: "What's up", subject: "Dan" },
{ greeting: "How's it going", subject: "Ben?" },
{ greeting: "Hello", subject: "World" }
],
"shouldRenderApple" : function() {
return true;
},
"citation": function() {
return {
authorName: "Dan Gilbert",
year: "2011"
};
}
};
var contextHandlebars = {
messages: [
{ greeting: "Hello", subject: "World" },
{ greeting: "What's up", subject: "Dan" },
{ greeting: "How's it going", subject: "Ben?" },
{ greeting: "Hello", subject: "World" },
{ greeting: "What's up", subject: "Dan" },
{ greeting: "How's it going", subject: "Ben?" },
{ greeting: "Hello", subject: "World" },
{ greeting: "What's up", subject: "Dan" },
{ greeting: "How's it going", subject: "Ben?" },
{ greeting: "Hello", subject: "World" }
]
};
Handlebars.registerHelper('citation', function() {
return {
authorName: "Dan Gilbert",
year: "2011"
};
});
Handlebars.registerHelper('shouldRenderApple', function() {
return true;
});
var template1 = "{{# messages }}<li>{{ greeting }}, {{ subject }} {{# shouldRenderApple }} APPLE {{/ shouldRenderApple }}</li>{{/ messages }}{{# citation }}{{ authorName }}, {{ year }}{{/ citation }}";
var template2 = "{{# messages }}<li>{{ greeting }}, {{ subject }} {{# shouldRenderApple }} APPLE {{/ shouldRenderApple }}</li>{{/ messages }}{{# citation }}{{ authorName }}, {{ year }}{{/ citation }}";
var templateHb1 = "{{# messages }}<li>{{ greeting }}, {{ subject }} {{#shouldRenderApple}} APPLE {{/shouldRenderApple}}</li>{{/ messages }}{{# citation }}{{ authorName }}, {{ year }}{{/ citation }}";
var templateHb2 = "{{# messages }}<li>{{ greeting }}, {{ subject }} {{#shouldRenderApple}} APPLE {{/shouldRenderApple}}</li>{{/ messages }}{{# citation }}{{ authorName }}, {{ year }}{{/ citation }}";
var templateX1 = "{{#messages}}<li>{{greeting}}, {{subject}} {{#shouldRenderApple}} APPLE {{/shouldRenderApple}}</li>{{/message}}{{#citation}}{{authorName}}, {{year}}{{/citation}}";
var compiledHogan = Hogan.compile(template2);
var compiledHandlebars = Handlebars.compile(templateHb2);
KISSY.add('xtpl', function (S, require, exports, module) {
return function (scope, S, undefined) {
var buffer = "",
config = this.config,
engine = this,
moduleWrap, utils = config.utils;
if (typeof module !== "undefined" && module.kissy) {
moduleWrap = module;
}
var runBlockCommandUtil = utils.runBlockCommand,
renderOutputUtil = utils.renderOutput,
getPropertyUtil = utils.getProperty,
runInlineCommandUtil = utils.runInlineCommand,
getPropertyOrRunCommandUtil = utils.getPropertyOrRunCommand;
buffer += '';
var config2 = {};
config2.fn = function (scope) {
var buffer = "";
buffer += '<li>';
var id0 = getPropertyOrRunCommandUtil(engine, scope, {}, "greeting", 0, 1);
buffer += renderOutputUtil(id0, true);
buffer += ', ';
var id1 = getPropertyOrRunCommandUtil(engine, scope, {}, "subject", 0, 1);
buffer += renderOutputUtil(id1, true);
buffer += ' ';
var config3 = {};
config3.fn = function (scope) {
var buffer = "";
buffer += ' APPLE ';
return buffer;
};
buffer += runBlockCommandUtil(engine, scope, config3, "shouldRenderApple", 1);
buffer += '</li>';
return buffer;
};
buffer += runBlockCommandUtil(engine, scope, config2, "messages", 1);
buffer += '';
var config4 = {};
config4.fn = function (scope) {
var buffer = "";
buffer += '';
var id2 = getPropertyOrRunCommandUtil(engine, scope, {}, "authorName", 0, 1);
buffer += renderOutputUtil(id2, true);
buffer += ', ';
var id3 = getPropertyOrRunCommandUtil(engine, scope, {}, "year", 0, 1);
buffer += renderOutputUtil(id3, true);
buffer += '';
return buffer;
};
buffer += runBlockCommandUtil(engine, scope, config4, "citation", 1);
return buffer;
};
});
Ready to run.
Test | Ops/sec | |
---|---|---|
Mustache 1 |
| ready |
Mustache 2 |
| ready |
Handlebars.js (uncompiled) |
| ready |
Handlebars.js (compiled) |
| ready |
Hogan.js (uncompiled) |
| ready |
Hogan.js (compiled) |
| ready |
xtemplate (uncompiled) |
| ready |
xtemplate (compiled) |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.