perfect
Version:
PERFect, simple JavaScript PERFormance tests
138 lines (109 loc) • 3.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.performanceTest = performanceTest;
// detect the global (see https://stackoverflow.com/questions/3277182)
// We do it this way because it works in strict mode AND in browsers that block
// eval with CSP.
//
// We need to do this because of Jest, it doesn't provide a normal global
// context.
var _global;
try {
_global = (42, eval)('this');
} catch (e) {
// best guess
_global = typeof window === 'object' ? window : global || {};
}
// in case the `performance` global isn't available (f.e. in Jest):
var performance = typeof _global.performance !== 'undefined' && _global.performance.now ? _global.performance : { now: Date.now.bind(Date) };
function performanceTest(ref) {
var description = ref.description;
var testCases = ref.testCases;
var iterations = ref.iterations;
var logResults = ref.logResults;
iterations = iterations || 500000;
var results = [];
if (logResults) {
console.log(" --- PERFORMANCE TEST: \"" + description + "\"");
console.log(' -- RUNNING... ');
}
for (var test in testCases) {
results.push(runTestCase(test, iterations, logResults, testCases[test]));
}
var slowest = results[0];
var fastest = results[0];
for (var i = 0, list = results; i < list.length; i += 1) {
var result = list[i];
if (result.averageTime > slowest.averageTime) {
slowest = result;
}
if (result.averageTime < fastest.averageTime) {
fastest = result;
}
}
if (logResults) {
console.log(' -- DONE! Results: ');
console.log(" -- SLOWEST: \"" + slowest.name + "\"");
console.log(" - total time: " + slowest.totalTime);
console.log(" - average time: " + slowest.averageTime);
console.log(" -- FASTEST: \"" + fastest.name + "\"");
console.log(" - total time: " + fastest.totalTime);
console.log(" - average time: " + fastest.averageTime);
}
return {
slowest: slowest,
fastest: fastest
};
}
function runTestCase(name, iterations, logResults, ref) {
var setup = ref.setup;
var before = ref.before;
var test = ref.test;
var after = ref.after;
var cleanup = ref.cleanup;
if (!test) {
throw new Error('Um, you need a test.');
}
var context = {};
var totalTime = 0;
var averageTime;
var startTime;
var endTime;
if (logResults) {
console.log(" -- TEST CASE: \"" + name + "\" -- ");
}
if (setup) {
setup.call(context, context);
}
for (var i = 0; i < iterations; i += 1) {
if (before) {
before.call(context, context);
}
var start = function () {
return startTime = performance.now();
};
var end = function () {
return endTime = performance.now();
};
var fallbackStartTime = performance.now();
test.call(context, start, end, context);
endTime = endTime || performance.now();
startTime = startTime || fallbackStartTime;
totalTime += endTime - startTime;
if (after) {
after.call(context, context);
}
}
if (cleanup) {
cleanup.call(context, context);
}
averageTime = totalTime / iterations;
if (logResults) {
console.log(" - total time: " + totalTime);
console.log(" - average time: " + averageTime);
}
return { name: name, totalTime: totalTime, averageTime: averageTime };
}
var version = exports.version = '1.1.0';