@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
JavaScript
"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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