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