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

228 lines 17.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CPUNode = exports.CPUNodeType = exports.RegExpTestRegex = void 0; const NodeModuleUtils_1 = require("./NodeModuleUtils"); const SourceNodeRegex_1 = require("../constants/SourceNodeRegex"); const NodeModule_1 = require("../model/NodeModule"); const UnifiedPath_1 = require("../system/UnifiedPath"); // Types const types_1 = require("../types"); exports.RegExpTestRegex = new RegExp(`^${SourceNodeRegex_1.LangInternalSourceNodeRegExpRegexString}$`); var CPUNodeType; (function (CPUNodeType) { CPUNodeType["extern"] = "extern"; CPUNodeType["intern"] = "intern"; CPUNodeType["langInternal"] = "lang_internal"; })(CPUNodeType || (exports.CPUNodeType = CPUNodeType = {})); class CPUNode { constructor(index, cpuModel, rootDir, node) { this._index = index; this.cpuModel = cpuModel; this.rootDir = rootDir; this.cpuNode = node; } get profilerHits() { return this.cpuModel.profilerHitsPerNode[this.index]; } get selfCPUEnergyConsumption() { return this.cpuModel.energyValuesPerNode ? this.cpuModel.energyValuesPerNode[this.index][types_1.EnergyValuesType.CPU] : 0; } get selfRAMEnergyConsumption() { return this.cpuModel.energyValuesPerNode ? this.cpuModel.energyValuesPerNode[this.index][types_1.EnergyValuesType.RAM] : 0; } get aggregatedEnergyConsumption() { if (this._aggregatedEnergyConsumption) { return this._aggregatedEnergyConsumption; } let totalCPU = this.selfCPUEnergyConsumption; let totalRAM = this.selfRAMEnergyConsumption; for (const child of this.children()) { totalCPU = totalCPU + child.aggregatedEnergyConsumption[types_1.EnergyValuesType.CPU]; totalRAM = totalRAM + child.aggregatedEnergyConsumption[types_1.EnergyValuesType.RAM]; } return (this._aggregatedEnergyConsumption = [totalCPU, totalRAM]); } get cpuEnergyConsumption() { return { selfCPUEnergyConsumption: this.selfCPUEnergyConsumption, aggregatedCPUEnergyConsumption: this.aggregatedEnergyConsumption[types_1.EnergyValuesType.CPU] }; } get ramEnergyConsumption() { return { selfRAMEnergyConsumption: this.selfRAMEnergyConsumption, aggregatedRAMEnergyConsumption: this.aggregatedEnergyConsumption[types_1.EnergyValuesType.RAM] }; } get index() { return this._index; } get cpuTime() { return { selfCPUTime: this.cpuNode.selfTime, aggregatedCPUTime: this.cpuNode.aggregateTime }; } get ISourceLocation() { if (this._sourceLocation === undefined) { this._sourceLocation = this.cpuModel.ILocations[this.cpuNode.locationId]; } return this._sourceLocation; } get sourceLocation() { const { lineNumber, columnNumber } = this.ISourceLocation.callFrame; return { lineNumber, columnNumber }; } get isLangInternal() { if (this._isLangInternal === undefined) { const sourceLocation = this.ISourceLocation; this._isLangInternal = sourceLocation.callFrame.url.startsWith('node:') || (sourceLocation.callFrame.url === '' && sourceLocation.callFrame.functionName.length > 0); } return this._isLangInternal; } get isEmpty() { if (this._isEmpty === undefined) { this._isEmpty = this.ISourceLocation.callFrame.url === ''; } return this._isEmpty; } get rawUrl() { if (this._rawUrl === undefined) { this._rawUrl = this.ISourceLocation.callFrame.url; } return this._rawUrl; } get url() { if (this._url === undefined) { this._url = new UnifiedPath_1.UnifiedPath(this.rawUrl); } return this._url; } get relativeUrl() { if (this._relativeUrl === undefined) { if (this.url.isRelative()) { this._relativeUrl = this.url.copy(); } else { this._relativeUrl = this.rootDir.pathTo(this.url); } } return this._relativeUrl; } get nodeModulePath() { if (this._nodeModulePath === undefined) { const modulePath = NodeModuleUtils_1.NodeModuleUtils.getParentModuleFromPath(this.relativeUrl); if (modulePath) { this._nodeModulePath = this.rootDir.join(modulePath); } else { this._nodeModulePath = null; } } return this._nodeModulePath; } get nodeModule() { if (this._nodeModule === undefined) { this._nodeModule = this.nodeModulePath ? NodeModule_1.NodeModule.fromNodeModulePath(this.nodeModulePath) : null; if (this.nodeModulePath && !this._nodeModule) { throw new Error('Module could not be found: ' + this.nodeModulePath.toString()); } } return this._nodeModule; } get relativeSourceFilePath() { if (this._relativeSourceFilePath === undefined) { if (!this.nodeModulePath || !this.nodeModule) { this._relativeSourceFilePath = this.relativeUrl; } else { if (this.url.isRelative()) { this._relativeSourceFilePath = this.nodeModulePath.pathTo(this.rootDir.join(this.url)); } else { this._relativeSourceFilePath = this.nodeModulePath.pathTo(this.url); } } } return this._relativeSourceFilePath; } get isExtern() { if (this._isExtern === undefined) { this._isExtern = (this.nodeModulePath !== null); } return this._isExtern; } get type() { if (this.isLangInternal) { return CPUNodeType.langInternal; } if (this.isExtern) { return CPUNodeType.extern; } return CPUNodeType.intern; } functionNameToSourceNodeIdentifier(functionName) { const chunks = []; let chunk = ''; let lastChar = ''; for (const char of functionName) { if (char === '.') { if (lastChar === '.') { chunk += char; } else { chunks.push(`{${chunk}}`); chunk = ''; } } else { chunk += char; } lastChar = char; } chunks.push(`{${chunk}}`); return chunks.join('.'); } get sourceNodeIdentifier() { if (this._sourceNodeIdentifier === undefined) { if (exports.RegExpTestRegex.test(this.ISourceLocation.callFrame.functionName)) { this._sourceNodeIdentifier = this.ISourceLocation.callFrame.functionName; } else { this._sourceNodeIdentifier = this.functionNameToSourceNodeIdentifier(this.ISourceLocation.callFrame.functionName); } } return this._sourceNodeIdentifier; } get isWithinTypescriptFile() { if (this._isWithinTypescriptFile === undefined) { this._isWithinTypescriptFile = this.relativeUrl.toString().slice(-3) === '.ts'; } return this._isWithinTypescriptFile; } get relativeJavascriptUrl() { if (this._relativeJavascriptUrl === undefined) { this._relativeJavascriptUrl = new UnifiedPath_1.UnifiedPath(this.relativeUrl.toString().slice(0, -3) + '.js'); } return this._relativeJavascriptUrl; } get javascriptUrl() { if (this._javascriptUrl === undefined) { this._javascriptUrl = new UnifiedPath_1.UnifiedPath(this.url.toString().slice(0, -3) + '.js'); } return this._javascriptUrl; } *children() { for (const childId of this.cpuNode.children) { yield this.cpuModel.getNode(childId); } } } exports.CPUNode = CPUNode; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ1BVTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oZWxwZXIvQ1BVTm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBbUQ7QUFHbkQsa0VBQXNGO0FBQ3RGLG9EQUFnRDtBQUVoRCx1REFBbUQ7QUFDbkQsUUFBUTtBQUNSLG9DQVFpQjtBQUVKLFFBQUEsZUFBZSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUkseURBQXVDLEdBQUcsQ0FBQyxDQUFBO0FBRXpGLElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUN0QixnQ0FBaUIsQ0FBQTtJQUNqQixnQ0FBZ0IsQ0FBQTtJQUNoQiw2Q0FBOEIsQ0FBQTtBQUMvQixDQUFDLEVBSlcsV0FBVywyQkFBWCxXQUFXLFFBSXRCO0FBRUQsTUFBYSxPQUFPO0lBMkJuQixZQUNDLEtBQWEsRUFDYixRQUFrQixFQUNsQixPQUFvQixFQUNwQixJQUFtQjtRQUVuQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtJQUNwQixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQsSUFBSSx3QkFBd0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsd0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQXNCLENBQUE7SUFDOUYsQ0FBQztJQUVELElBQUksd0JBQXdCO1FB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