Last active
June 1, 2021 07:16
-
-
Save azu/d7942102dc5282b0eca859149791c3f0 to your computer and use it in GitHub Desktop.
Logging Timer and requestAnimationFrame
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* ## Usage | |
* | |
* 1. Load following script | |
* 2. `window.getContexualLogResult()` output the result to console | |
* | |
* ## Description | |
* | |
* - It spy "setTimeout", "setInterval", and "requestAnimationFrame". | |
* - Collect call count and collect stack trace. | |
*/ | |
// Disapprear log less than 5 | |
const thresholdCount = 5; | |
const map = new Map([ | |
["setTimeout", {}], | |
["setInterval", {}], | |
["requestAnimationFrame", {}] | |
]); | |
window.getContexualLogResult = () => { | |
["setTimeout", "setInterval", "requestAnimationFrame"].forEach(name => { | |
const result = Object.entries(map.get(name)) | |
.filter(entry => { | |
return entry[1] > thresholdCount; | |
}).map(entry => { | |
return { | |
code: entry[0], | |
count: entry[1] | |
} | |
}); | |
console.group(name); | |
console.table(result); | |
console.groupEnd(name); | |
}); | |
} | |
const contexualLog = (type, log) => { | |
if (map.has(type)) { | |
const object = map.get(type); | |
const count = object[log] ? object[log] : 0; | |
object[log] = count + 1; | |
} else { | |
const object = {}; | |
const count = object[log] ? object[log] : 0; | |
object[log] = count + 1; | |
map.set(type, object); | |
} | |
} | |
const originalTimout = window.setTimeout; | |
window.setTimeout = function () { | |
const stack = (new Error().stack).split("\n").slice(1); | |
if (arguments.callee.caller) { | |
contexualLog("setTimeout", arguments.callee.caller.toString() + "\n" + stack); | |
} else { | |
contexualLog("setInterval", stack) | |
} | |
return originalTimout.apply(window, arguments); | |
} | |
const originalInterval = window.setInterval; | |
window.setInterval = function () { | |
const stack = (new Error().stack).split("\n").slice(1).join("\n"); | |
if (arguments.callee.caller) { | |
contexualLog("setInterval", arguments.callee.caller.toString() + "\n" + stack); | |
} else { | |
contexualLog("setInterval", stack) | |
} | |
return originalInterval.apply(window, arguments); | |
} | |
const originalRaF = window.requestAnimationFrame; | |
window.requestAnimationFrame = function (callback) { | |
const stack = (new Error().stack).split("\n").slice(1).join("\n"); | |
if (arguments.callee.caller) { | |
contexualLog("requestAnimationFrame", arguments.callee.caller.toString() + "\n" + stack); | |
} else { | |
contexualLog("requestAnimationFrame", stack) | |
} | |
return originalRaF(callback); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment