This repo will profile your code by giving the execution time of all promises in a json without disturbing the production level code.
- The documentation can be found here.
-
Install bluebird-promise-profiler as dev dependency
npm i --save-dev bluebird-promise-profiler
-
Please upgrade to the latest version for bug free experience.
-
Version >= 1.3.0
of this package works for all node versions.
-
We will implement routes and model for two function multiply and square (the working examples can be seen in ./examples of this repository).
-
File: ./routes/route.js
'use strict'; const Promise = require('bluebird'); const Model = require('../models/Model'); /** * Route for calling square function in ../models/Model.js * @param num * @returns {Promise} */ const squareRoute = function squareRoute (num) { return Model.square(num) // the function name 'squarePromise' will be one of the key in output of the profiler whose value would be around 1000 milliseconds .then(function squarePromise (result) { return {result}; }); }; const squareAndMultiplyRoute = function squareAndMultiply (num1, num2) { return Promise.join(Model.multiply(num1, num2), Model.square(num1)) // the function name 'spreadFunction' will be one of the key in output of the profiler whose value would be around 2000 milliseconds .spread(function spreadFunction (multiplyResult, squareResult) { return {multiplyResult, squareResult}; }); }; module.exports = { squareRoute: squareRoute, squareAndMultiplyRoute: squareAndMultiplyRoute };
-
File: ./models/Model.js
'use strict'; const Promise = require('bluebird'); /** * Makes a delay of one second and returns back a promise which multiplies the two numbers. * @param num1 * @param num2 * @returns {bluebird} Returns back a promise which multiplies the two numbers. */ const multiply = function multiply (num1, num2) { return new Promise (function (resolve, reject) { setTimeout(function promise1Timeout () { resolve(num1 * num2); }, 1000); }); }; /** * Makes delay of one second and then calls multiply which further makes a delay of one second, so total delay is two seconds. * @param num1 * @returns {bluebird} Returns back a promise which multiplies the given number. */ const square = function square (num1) { return new Promise (function (resolve, reject) { setTimeout(function promise1Timeout () { multiply(num1, num1) // the function name 'multiplyPromise' will be one of the key in output of the profiler whose value would be around 1000 milliseconds .then(function multiplyPromise (result) { resolve(result); }); }, 1000); }); }; module.exports = { square: square, multiply: multiply };
-
The above are the files for routes and model respectively for squaring and multiplying numbers.
-
The multiply function in models causes a delay of one second and returns the output, therefore total time taken by square function is one seconds
-
The square function also makes a delay of one second and then calls the multiply function, therefore total time taken by square function is two seconds.
-
So now we need to profile this, without touching the code, now we make a temporary file called profiler.js
-
profiler.js
'use strict'; // to run this file type 'node profiler' in the terminal const route = require('./routes/route'); const promiseProfiler = require('bluebird-promise-profiler'); promiseProfiler.startProfiling(); //call square route route.squareRoute(5).then((res) => { // { result: 25 } console.log(res); // { multiplyPromise: 1004.3564850000002, squarePromise: 2009.1301549999998 } console.log(promiseProfiler.getProfilerResult()); // reset profiler result to analyze other route promiseProfiler.resetProfiler(); // call squareAndMultiply route route.squareAndMultiplyRoute(4, 5).then((result) => { // { multiplyResult: 20, squareResult: 16 } console.log(result); // note there is a multiplyPromise included in this response as square function internally calls multiply function // { multiplyPromise: 1004.7086040000004, spreadFunction: 2008.4984540000005 } console.log(promiseProfiler.getProfilerResult()); // stop the profiler once the profiling is done promiseProfiler.stopProfiling(); }); });
-
Profiling would be done according to the function names given in .then() and .spread() functions.
-
Anonymous functions given inside .then() or .spread() will not be profiled. So please do give names into those functions.
-
Steps to run examples in this repo:
npm run-script examples
-
Test without code coverage
npm test
-
Test with code coverage
npm run-script test-with-coverage