// replace setTimeout with an implementation that counts it's invocations. var timeouts = 0; var _setTimeout = window.setTimeout.bind(window); window.setTimeout = function(f, t) { timeouts++; return _setTimeout(f, t); }; // track the start time. var start = performance.now(); function displayResult() { var end = performance.now(); var status = document.querySelector('#status'); status.textContent += ' done.\n'; status.textContent += (end - start).toString(10) + 'ms elapsed.\n'; status.textContent += 'setTimeout called ' + timeouts.toString(10) + ' times.'; } // chain up some promises... var i = 1000; var p = new Promise(function(resolve, reject) { resolve(); }); while (i--) { p = p.then(function(resolve, reject) { return 'done'; }); } p.then(displayResult);