marko/benchmark/vdom/client.js
2016-11-02 20:23:42 -06:00

122 lines
3.3 KiB
JavaScript

var HTMLElement = require('../../runtime/vdom/HTMLElement');
var Text = require('../../runtime/vdom/Text');
var Comment = require('../../runtime/vdom/Comment');
var DocumentFragment = require('../../runtime/vdom/DocumentFragment');
var resultsEl = document.getElementById('results');
var running = false;
var benchmarks = {};
function loadScript(path) {
return new Promise(function(resolve, reject) {
var script = document.createElement('script');
script.src = path;
script.onload = function () {
resolve();
};
script.onerror = function(e) {
reject(e);
};
document.head.appendChild(script); //or something of the likes
});
}
function loadScripts(paths) {
return Promise.all(paths.map(function(path) {
return loadScript(path);
}));
}
function runSuite(suite) {
return new Promise(function(resolve, reject) {
if (running) {
return;
}
running = true;
suite
.on('start', function(event) {
resultsEl.innerHTML += 'Running "' + suite.name + '"...\n';
})
.on('cycle', function(event) {
resultsEl.innerHTML += String(event.target) + '\n';
})
.on('complete', function() {
resultsEl.innerHTML += 'Fastest is ' + this.filter('fastest').map('name') + '\n\n--------------\n\n';
running = false;
suite.off('start cycle complete');
resolve();
})
.on('error', function(e) {
running = false;
suite.off('start cycle complete error');
reject(e.target.error);
})
// run async
.run({ 'async': true });
});
}
var vdom = window.MarkoVDOM = {
virtualize: require('../../runtime/vdom/virtualize'),
createElement: function(tagName, attrs, childCount, constId) {
return new HTMLElement(tagName, attrs, childCount, constId);
},
createText: function(value) {
return new Text(value);
},
createComment: function(value) {
return new Comment(value);
},
createDocumentFragment: function() {
return new DocumentFragment();
}
};
var app = {
loadScript,
loadScripts,
runSuite,
vdom
};
function registerBenchmark(name, func) {
benchmarks[name] = func(app);
}
registerBenchmark('create', require('./benchmark-create'));
registerBenchmark('walk', require('./benchmark-walk'));
document.body.addEventListener('click', function(event) {
if (running) {
return;
}
var target = event.target;
var benchmarkName = target.getAttribute('data-benchmark');
if (benchmarkName) {
var oldButtonLabel = target.innerHTML;
target.innerHTML = oldButtonLabel + ' - running...';
resultsEl.innerHTML = '';
var benchmarkFunc = benchmarks[benchmarkName];
benchmarkFunc()
.then(function() {
target.innerHTML = oldButtonLabel;
resultsEl.innerHTML += '\nDONE!';
})
.catch(function(e) {
target.innerHTML = oldButtonLabel;
console.error(e);
resultsEl.innerHTML = e.toString();
});
}
});