@oaklean/profiler-core
Version:
Part of the @oaklean suite. It provides all basic functions to work with the `.oak` file format. It allows parsing the `.oak` file format as well as tools for analyzing the measurement values. It also provides all necessary capabilities required for prec
131 lines • 8.99 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CPUProfileHelper = void 0;
const fs = __importStar(require("fs"));
const CPUModel_1 = require("./CPUModel");
const CPUProfileSourceLocation_1 = require("./CPUProfileSourceLocation");
const UnifiedPath_1 = require("../../system/UnifiedPath");
const LoggerHelper_1 = require("../LoggerHelper");
const JSONHelper_1 = require("../JSONHelper");
class CPUProfileHelper {
/**
* This function is used to convert all paths in the CPU profile to relative paths.
* (relative to the rootDir)
*
* The CPU profile is then written to the given output path.
* This creates anonymized CPU profiles that can be shared with others
* while still preserving the structure of the profile
* so it can be used in the InsertCPUProfileHelper.insertCPUProfile function.
*
* @param rootDir path to the root directory of the project
*
* @param cpuProfilePath path to the CPU profile that should be anonymized
* @param outPath path to the output file
*/
static anonymize(rootDir, cpuProfilePath, outPath) {
return __awaiter(this, void 0, void 0, function* () {
const cpuProfile = yield CPUProfileHelper.loadFromFile(cpuProfilePath);
if (cpuProfile === undefined) {
LoggerHelper_1.LoggerHelper.error(`CPU profile could not be loaded from ${cpuProfilePath.toPlatformString()}. ` +
'Please make sure the file exists and is a valid CPU profile.');
return;
}
const nodes = cpuProfile.nodes;
for (const node of nodes) {
const location = new CPUProfileSourceLocation_1.CPUProfileSourceLocation(rootDir, 0, node.callFrame);
if (!location.isLangInternal && !location.isWASM) {
node.callFrame.url = location.relativeUrl.toString();
}
}
yield CPUProfileHelper.storeToFile(cpuProfile, outPath);
});
}
static loadFromFile(cpuProfilePath) {
return __awaiter(this, void 0, void 0, function* () {
if (!fs.existsSync(cpuProfilePath.toPlatformString())) {
return undefined;
}
try {
return yield JSONHelper_1.JSONHelper.loadBigJSON(cpuProfilePath);
}
catch (error) {
LoggerHelper_1.LoggerHelper.error(`Error loading CPU profile from ${cpuProfilePath.toPlatformString()}: ${error}`);
return undefined;
}
});
}
static inspect(cpuProfile) {
return __awaiter(this, void 0, void 0, function* () {
const cpuModel = new CPUModel_1.CPUModel(new UnifiedPath_1.UnifiedPath(__dirname).join('..'), cpuProfile, BigInt(0));
const nodeCount = cpuModel.INodes.length;
const sourceNodeLocationCount = cpuModel.CPUProfileSourceLocations.length;
const sampleCount = cpuModel.samples.length;
let totalHits = 0;
let totalCPUTime = 0;
function traverse(cpuNode) {
for (const child of cpuNode.children()) {
totalCPUTime += child.cpuTime.selfCPUTime || 0;
totalHits += child.profilerHits;
traverse(child);
}
}
traverse(cpuModel.getNode(0));
return {
nodeCount,
sourceNodeLocationCount,
sampleCount,
totalHits,
totalCPUTime
};
});
}
static storeToFile(cpuProfile, cpuProfilePath) {
return __awaiter(this, void 0, void 0, function* () {
yield JSONHelper_1.JSONHelper.storeBigJSON(cpuProfilePath, cpuProfile);
});
}
}
exports.CPUProfileHelper = CPUProfileHelper;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ1BVUHJvZmlsZUhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9oZWxwZXIvQ1BVUHJvZmlsZS9DUFVQcm9maWxlSGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF3QjtBQUl4Qix5Q0FBcUM7QUFFckMseUVBQXFFO0FBRXJFLDBEQUFzRDtBQUN0RCxrREFBOEM7QUFDOUMsOENBQTBDO0FBRzFDLE1BQWEsZ0JBQWdCO0lBQzVCOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxNQUFNLENBQU8sU0FBUyxDQUNyQixPQUFvQixFQUNwQixjQUEyQixFQUMzQixPQUFvQjs7WUFFcEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUE7WUFFdEUsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlCLDJCQUFZLENBQUMsS0FBSyxDQUNqQix3Q0FBd0MsY0FBYyxDQUFDLGdCQUFnQixFQUFFLElBQUk7b0JBQzVFLDhEQUE4RCxDQUMvRCxDQUFBO2dCQUNELE9BQU07WUFDUCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQW1DLENBQUE7WUFDNUQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxtREFBd0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDekUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBQ3JELENBQUM7WUFDRixDQUFDO1lBQ0QsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3hELENBQUM7S0FBQTtJQUVELE1BQU0sQ0FBTyxZQUFZLENBQ3hCLGNBQTJCOztZQUUzQixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZELE9BQU8sU0FBUyxDQUFBO1lBQ2pCLENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0osT0FBTyxNQUFNLHVCQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ3BELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNoQiwyQkFBWSxDQUFDLEtBQUssQ0FDakIsa0NBQWtDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEtBQUssRUFBRSxDQUMvRSxDQUFBO2dCQUNELE9BQU8sU0FBUyxDQUFBO1lBQ2pCLENBQUM7UUFDRixDQUFDO0tBQUE7SUFFRCxNQUFNLENBQU8sT0FBTyxDQUFDLFVBQWdDOztZQUNwRCxNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQzVCLElBQUkseUJBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ3JDLFVBQVUsRUFDVixNQUFNLENBQUMsQ0FBQyxDQUF1QixDQUMvQixDQUFBO1lBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUE7WUFDeEMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFBO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFBO1lBQzNDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQTtZQUNqQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUE7WUFFcEIsU0FBUyxRQUFRLENBQUMsT0FBZ0I7Z0JBQ2pDLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7b0JBQ3hDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUE7b0JBQzlDLFNBQVMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFBO29CQUMvQixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ2hCLENBQUM7WUFDRixDQUFDO1lBQ0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUU3QixPQUFPO2dCQUNOLFNBQVM7Z0JBQ1QsdUJBQXVCO2dCQUN2QixXQUFXO2dCQUNYLFNBQVM7Z0JBQ1QsWUFBWTthQUNaLENBQUE7UUFDRixDQUFDO0tBQUE7SUFFRCxNQUFNLENBQU8sV0FBVyxDQUN2QixVQUFnQyxFQUNoQyxjQUEyQjs7WUFFM0IsTUFBTSx1QkFBVSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFDMUQsQ0FBQztLQUFBO0NBQ0Q7QUE5RkQsNENBOEZDIn0=