@oaklean/profiler
Version:
A library to measure the energy consumption of your javascript/typescript code
60 lines • 5.17 kB
JavaScript
;
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=