UNPKG

perfect

Version:

PERFect, simple JavaScript PERFormance tests

138 lines (109 loc) 3.7 kB
'use strict'; 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';