UNPKG

@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
"use strict"; 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=