UNPKG

@oaklean/profiler

Version:

A library to measure the energy consumption of your javascript/typescript code

60 lines 5.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CPUProfilerCleanUpHelper = void 0; class CPUProfilerCleanUpHelper { // Method to fix accumulated errors in cpu profiles caused by negative timeDelta // https://github.com/jlfwong/speedscope/blob/main/src/import/chrome.ts // https://github.com/jlfwong/speedscope/pull/305 static cleanUpProfile(profile) { if (profile.samples === undefined || profile.timeDeltas === undefined) { throw new Error('NodeInspectorProfiler.cleanUpProfile: profile format is not complete'); } const sampleTimes = []; // The first delta is relative to the profile startTime. // Ref: https://github.com/v8/v8/blob/44bd8fd7/src/inspector/js_protocol.json#L1485 let elapsed = profile.timeDeltas[0]; // Prevents negative time deltas from causing bad data. See // https://github.com/jlfwong/speedscope/pull/305 for details. let lastValidElapsed = elapsed; // The chrome CPU profile format doesn't collapse identical samples. We'll do that // here to save a ton of work later doing mergers. for (let i = 0; i < profile.samples.length; i++) { if (elapsed < lastValidElapsed) { sampleTimes.push(lastValidElapsed); } else { sampleTimes.push(elapsed); lastValidElapsed = elapsed; } if (i === profile.samples.length - 1) { if (elapsed < lastValidElapsed) { sampleTimes.push(lastValidElapsed); } else { sampleTimes.push(elapsed); lastValidElapsed = elapsed; } } else { const timeDelta = profile.timeDeltas[i + 1]; elapsed += timeDelta; } } let latest = sampleTimes[0]; const timeDeltas = [latest]; for (let i = 1; i < sampleTimes.length - 1; i++) { const delta = sampleTimes[i] - latest; timeDeltas.push(delta); latest = sampleTimes[i]; } profile.timeDeltas = timeDeltas; for (const node of profile.nodes) { // node:inspector returns 0-based line and column numbers // the previously used v8-profiler-next used 1-based line and column numbers node.callFrame.lineNumber += 1; // convert to 1-based line number node.callFrame.columnNumber += 1; // convert to 1-based column number } } } exports.CPUProfilerCleanUpHelper = CPUProfilerCleanUpHelper; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ1BVUHJvZmlsZUNsZWFuVXBIZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaGVscGVyL0NQVVByb2ZpbGVDbGVhblVwSGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsd0JBQXdCO0lBQ3BDLGdGQUFnRjtJQUNoRix1RUFBdUU7SUFDdkUsaURBQWlEO0lBQ2pELE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBNkI7UUFDbEQsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQ2Qsc0VBQXNFLENBQ3RFLENBQUE7UUFDRixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFBO1FBRWhDLHdEQUF3RDtRQUN4RCxtRkFBbUY7UUFDbkYsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUVuQywyREFBMkQ7UUFDM0QsOERBQThEO1FBQzlELElBQUksZ0JBQWdCLEdBQUcsT0FBTyxDQUFBO1FBRTlCLGtGQUFrRjtRQUNsRixrREFBa0Q7UUFDbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxPQUFPLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDaEMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1lBQ25DLENBQUM7aUJBQU0sQ0FBQztnQkFDUCxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUN6QixnQkFBZ0IsR0FBRyxPQUFPLENBQUE7WUFDM0IsQ0FBQztZQUVELElBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO29CQUNoQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBQ25DLENBQUM7cUJBQU0sQ0FBQztvQkFDUCxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN6QixnQkFBZ0IsR0FBRyxPQUFPLENBQUE7Z0JBQzNCLENBQUM7WUFDRixDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQzNDLE9BQU8sSUFBSSxTQUFTLENBQUE7WUFDckIsQ0FBQztRQUNGLENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUUzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFBO1lBQ3JDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDdEIsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBRUQsT0FBTyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFFL0IsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEMseURBQXlEO1lBQ3pELDRFQUE0RTtZQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUEsQ0FBQyxpQ0FBaUM7WUFDaEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFBLENBQUMsbUNBQW1DO1FBQ3JFLENBQUM7SUFDRixDQUFDO0NBQ0Q7QUE3REQsNERBNkRDIn0=