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

150 lines 15.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CompensationHelper = void 0; const StateMachineLogger_1 = require("./StateMachineLogger"); const LoggerHelper_1 = require("../LoggerHelper"); const Switch_1 = require("../../system/Switch"); const SensorValues_1 = require("../../model/SensorValues"); let COMPENSATION_ID_COUNTER = 1; class CompensationHelper { static createCompForParent(compensation) { // compensation to be carried upwards // id stays the same // but createdComp is set to null return { id: compensation.id, createdComp: null, // if createdComp is null, just carry the existing carriedComp upwards carriedComp: compensation.createdComp || compensation.carriedComp }; } static addToCompensation(target, add) { target.carriedComp = SensorValues_1.SensorValues.sum(target.carriedComp, add.createdComp || add.carriedComp); } static createCompensationIfNecessary(node, currentState, transitionResult, debug) { if ( // no link was created transitionResult.accountingInfo.accountedSourceNodeReference === null && // special case: lang_internal nodes never create links currentState.type !== 'lang_internal') { // if no link is created, we treat this as a special case // this call is treated as if the call tree starts here // // since the current node was accounted with the full aggregated sensor values // without a reference being created, the current nodes sensor values do not add up // we need to compensate the accounted sensor values here // and in all its parents // so the compensation needs to be carried upwards const compensation = { id: COMPENSATION_ID_COUNTER++, createdComp: new SensorValues_1.SensorValues(node.sensorValues), carriedComp: new SensorValues_1.SensorValues({}) }; if (debug !== undefined) { StateMachineLogger_1.StateMachineLogger.logCompensation(debug.depth, debug.node, transitionResult.nextState, compensation, 'CREATE COMPENSATION'); } return compensation; } } /* * A -> B (a: parent, b: current) * * Compensates: * - B * - A.(intern|extern|lang_internal) * - A.accountedSourceNodeReference * */ static applyCompensation(node, currentState, parentState, compensation, accountingInfo, debug) { if (accountingInfo.accountedSourceNode.firstTimeVisited) { // only compensate the accounted source node if its the first occurrence in the call tree (from the root) accountingInfo.accountedSourceNode.node.sensorValues.addToAggregated(compensation.carriedComp, -1); } else if (accountingInfo.accountedSourceNode.firstTimeInCurrentCompensationLayer) { // if its not the first time visited, but the first time in the current compensation layer // we need to add the currents cpu node's aggregated sensor values // to prevent double compensation accountingInfo.accountedSourceNode.node.sensorValues.addToAggregated(compensation.carriedComp.clone().addToAggregated(node.sensorValues, -1), -1); } if (accountingInfo.accountedSourceNodeReference === null) { // no link was created, nothing more to compensate return; } if (debug !== undefined) { StateMachineLogger_1.StateMachineLogger.logCompensation(debug.depth, node, currentState, compensation, 'APPLY COMPENSATION'); } // if the current reference was already visited before // we need to add the currents cpu node's aggregated sensor values // to prevent double compensation const referenceCompensation = accountingInfo.accountedSourceNodeReference .firstTimeVisited ? compensation.carriedComp : compensation.carriedComp.clone().addToAggregated(node.sensorValues, -1); if (accountingInfo.accountedSourceNodeReference.reference === undefined) { return; } if (debug !== undefined) { LoggerHelper_1.LoggerHelper.warn(`[REFERENCE-COMPENSATION] ${accountingInfo.accountedSourceNodeReference.reference.id}`); } // only compensate (lang_internal|intern|extern) when there was a link created // compensate the accounted source node reference accountingInfo.accountedSourceNodeReference.reference.sensorValues.addToAggregated(referenceCompensation, -1); if (parentState.callIdentifier.sourceNode === null) { // parent source node does not exist (e.g. root) return; } switch (accountingInfo.type) { case 'accountToIntern': parentState.callIdentifier.sourceNode.sensorValues.addToIntern(referenceCompensation, -1); break; case 'accountToExtern': parentState.callIdentifier.sourceNode.sensorValues.addToExtern(referenceCompensation, -1); break; case 'accountToLangInternal': parentState.callIdentifier.sourceNode.sensorValues.addToLangInternal(referenceCompensation, -1); break; case 'accountOwnCodeGetsExecutedByExternal': throw new Error('InsertCPUProfileStateMachine.insertCPUNodes: compensation not supported for accountOwnCodeGetsExecutedByExternal'); case null: break; default: (0, Switch_1.assertUnreachable)(accountingInfo.type); } } /* * Propagates the given compensation to the parent stack frame if it exists. * If the parent stack frame already has a compensation, the given compensation * is added to it. */ static propagateCompensation(parentStackFrame, compensation, debugInfo) { var _a, _b, _c, _d, _e, _f; if (parentStackFrame !== undefined && parentStackFrame.result !== undefined) { if (parentStackFrame.result.compensation === undefined) { // carry upwards parentStackFrame.result.compensation = CompensationHelper.createCompForParent(compensation); } else { // add to existing compensation (also carried upwards) CompensationHelper.addToCompensation(parentStackFrame.result.compensation, compensation); } if (debugInfo !== undefined) { LoggerHelper_1.LoggerHelper.log(LoggerHelper_1.LoggerHelper.warnString('[CARRY-COMPENSATION]') + ` ${compensation.id} -> ${parentStackFrame.result.compensation.id}\n` + `├─ CPU Node : ${debugInfo.node.index}\n` + `├─ Compensation ID : ${compensation.id}\n` + `├─ Carried CPU Time : created=${(_a = compensation.createdComp) === null || _a === void 0 ? void 0 : _a.aggregatedCPUTime} | µs carried=${compensation.carriedComp.aggregatedCPUTime} µs \n` + `├─ Carried CPU Energy : created=${(_b = compensation.createdComp) === null || _b === void 0 ? void 0 : _b.aggregatedCPUEnergyConsumption} | carried=${compensation.carriedComp.aggregatedCPUEnergyConsumption} µs \n` + `├─ Carried RAM Energy : created=${(_c = compensation.createdComp) === null || _c === void 0 ? void 0 : _c.aggregatedRAMEnergyConsumption} | carried=${compensation.carriedComp.aggregatedRAMEnergyConsumption} µs \n` + `├─ Parent Compensation ID : ${compensation.id}\n` + `├─ Parent Compensated CPU Time : created=${(_d = parentStackFrame.result.compensation.createdComp) === null || _d === void 0 ? void 0 : _d.aggregatedCPUTime} µs | carried=${parentStackFrame.result.compensation.carriedComp.aggregatedCPUTime} µs \n` + `├─ Parent Compensated CPU Energy : created=${(_e = parentStackFrame.result.compensation.createdComp) === null || _e === void 0 ? void 0 : _e.aggregatedCPUEnergyConsumption} µs | carried=${parentStackFrame.result.compensation.carriedComp.aggregatedCPUEnergyConsumption} µs \n` + `├─ Parent Compensated RAM Energy : created=${(_f = parentStackFrame.result.compensation.createdComp) === null || _f === void 0 ? void 0 : _f.aggregatedRAMEnergyConsumption} µs | carried=${parentStackFrame.result.compensation.carriedComp.aggregatedRAMEnergyConsumption} µs \n`); StateMachineLogger_1.StateMachineLogger.logState(debugInfo.depth + 1, debugInfo.node, debugInfo.currentState); } } } } exports.CompensationHelper = CompensationHelper; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGVuc2F0aW9uSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hlbHBlci9JbnNlcnRDUFVQcm9maWxlSGVscGVyL0NvbXBlbnNhdGlvbkhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSw2REFBeUQ7QUFJekQsa0RBQThDO0FBQzlDLGdEQUF1RDtBQUN2RCwyREFBdUQ7QUFFdkQsSUFBSSx1QkFBdUIsR0FBRyxDQUFDLENBQUE7QUFFL0IsTUFBYSxrQkFBa0I7SUFDOUIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFlBQTBCO1FBQ3BELHFDQUFxQztRQUNyQyxvQkFBb0I7UUFDcEIsaUNBQWlDO1FBQ2pDLE9BQU87WUFDTixFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUU7WUFDbkIsV0FBVyxFQUFFLElBQUk7WUFDakIsc0VBQXNFO1lBQ3RFLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVyxJQUFJLFlBQVksQ0FBQyxXQUFXO1NBQ2pFLENBQUE7SUFDRixDQUFDO0lBRUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQW9CLEVBQUUsR0FBaUI7UUFDL0QsTUFBTSxDQUFDLFdBQVcsR0FBRywyQkFBWSxDQUFDLEdBQUcsQ0FDcEMsTUFBTSxDQUFDLFdBQVcsRUFDbEIsR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUNsQyxDQUFBO0lBQ0YsQ0FBQztJQUVELE1BQU0sQ0FBQyw2QkFBNkIsQ0FDbkMsSUFBYSxFQUNiLFlBQW1CLEVBQ25CLGdCQUFrQyxFQUNsQyxLQUdDO1FBRUQ7UUFDQyxzQkFBc0I7UUFDdEIsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLDRCQUE0QixLQUFLLElBQUk7WUFDckUsdURBQXVEO1lBQ3ZELFlBQVksQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUNwQyxDQUFDO1lBQ0YseURBQXlEO1lBQ3pELHVEQUF1RDtZQUN2RCxFQUFFO1lBQ0YsOEVBQThFO1lBQzlFLG1G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