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