UNPKG

@oaklean/profiler

Version:

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

88 lines 7.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.V8Profiler = void 0; const profiler_core_1 = require("@oaklean/profiler-core"); // eslint-disable-next-line @typescript-eslint/no-var-requires const v8Profiler = require('v8-profiler-next'); class V8Profiler { static startProfiling(name, recsamples, mode) { v8Profiler.startProfiling(name, recsamples, mode); } static stopProfiling(name) { const profile = v8Profiler.stopProfiling(name); V8Profiler.cleanUpProfile(profile); V8Profiler.unifyProfile(profile); return profile; } static setGenerateType(type) { v8Profiler.setGenerateType(type); } static setSamplingInterval(num) { v8Profiler.setSamplingInterval(num); } /** * Unifies the V8 Profile to ensure compatibility between linux / mac / windows * All filePaths are converted to unix paths * * @param profile */ static unifyProfile(profile) { for (const node of profile.nodes) { if (node.callFrame.url !== '' && !node.callFrame.url.startsWith('node:')) { if (node.callFrame.url.startsWith('file://')) { node.callFrame.url = node.callFrame.url.slice(7); } node.callFrame.url = new profiler_core_1.UnifiedPath(node.callFrame.url).toString(); } } } // 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('V8Profiler.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; } } exports.V8Profiler = V8Profiler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVjhQcm9maWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC9WOFByb2ZpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLDBEQUF5RTtBQUV6RSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUE7QUFFOUMsTUFBYSxVQUFVO0lBQ3RCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWSxFQUFFLFVBQW9CLEVBQUUsSUFBWTtRQUNyRSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBYTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlDLFVBQVUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbEMsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNoQyxPQUFPLE9BQU8sQ0FBQTtJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQVc7UUFDakMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQXdCO1FBQ2xELFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQTZCO1FBQ2hELEtBQUssTUFBTSxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9B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