'use strict';
var esprima, Benchmark, readFile, dirname, log, fixture;
fixture = [
'Underscore 1.5.2',
'Backbone 1.1.0',
'MooTools 1.4.5',
'jQuery 1.9.1',
'YUI 3.12.0',
'jQuery.Mobile 1.4.2',
'Angular 1.2.5'
];
function slug(name) {
return name.toLowerCase().replace(/\.js/g, 'js').replace(/\s/g, '-');
}
function kb(bytes) {
return (bytes / 1024).toFixed(1);
}
function runParserTests(tests) {
var tree = [],
totalTime = 0,
totalSize = 0,
totalRme = 0;
function pad(str, len) {
var result = str;
while (result.length < len) {
result = ' ' + result;
}
return result;
}
tests.reduce(function (suite, filename) {
var source = readFile(dirname + '/3rdparty/' + slug(filename) + '.js'),
size = source.length;
totalSize += size;
return suite.add(filename, function () {
var syntax = esprima.parse(source, { range: true, loc: true });
tree.push(syntax.body.length);
}, {
'onComplete': function (event) {
var result;
if (typeof gc === 'function') {
gc();
}
result = pad(this.name, 20);
result += pad(kb(size) + ' KiB', 12);
result += pad((1000 * this.stats.mean).toFixed(2), 10);
result += ' ms \xb1 ' + this.stats.rme.toFixed(2) + '%';
log(result);
totalTime += this.stats.mean;
totalRme += this.stats.mean * this.stats.rme * this.stats.rme;
}
});
}, new Benchmark.Suite()).on('complete', function () {
log(' ------------------------');
log(pad(kb(totalSize) + ' KiB', 32) +
pad((1000 * totalTime).toFixed(2), 10) + ' ms \xb1 ' +
Math.sqrt(totalRme / totalTime).toFixed(2) + '%'
);
}).run();
}
if (typeof require === 'undefined') {
dirname = 'test';
load(dirname + '/3rdparty/benchmark.js');
load(dirname + '/../dist/esprima.js');
Benchmark = this.Benchmark;
esprima = this.esprima;
readFile = this.read;
log = print;
} else {
Benchmark = require('./3rdparty/benchmark');
esprima = require('../');
readFile = function (filename) {
return require('fs').readFileSync(filename, 'utf-8');
};
dirname = __dirname;
log = console.log.bind(console);
}
log('Parsing speed (with' + (typeof gc === 'function' ? '' : 'out') + ' gc):');
runParserTests(fixture);