{"version":3,"sources":["performance_measure.ts"],"sourcesContent":["// used for Runtime/Compiler performance measuring\n\nimport { DatexObject } from \"../types/object.ts\";\nimport { logger } from \"../utils/global_values.ts\";\n\n\n// average measured durations are available as DatexObjects\nexport class RuntimePerformance {\n\n    static enabled = false;\n\n    /** adds a new marker and measures + logs the time from a given start marker to the new marker*/\n\n    static marker(description:string, new_marker:string, start_marker:string){\n        if (!globalThis.performance?.getEntriesByName) return;\n        if (!globalThis.performance.getEntriesByName(\"runtime_start\").length) globalThis.performance.mark(\"runtime_start\");\n    \n        const meas_name = start_marker+\"-\"+new_marker;\n        globalThis.performance.mark(new_marker);\n        globalThis.performance.measure(meas_name, start_marker);\n        \n        // TODO reenable\n        //logger.info(`${description}: ${ Math.round(globalThis.performance.getEntriesByName(meas_name, 'measure')[0]?.duration)}ms`)\n    }\n\n    static #marker_count = new Map<string,number>();\n\n    static #measurements_groups = new Map<string,object>(); // group name, measurement\n\n    static MEAS_COUNT = Symbol(\"MEAS_COUNT\")\n\n    /** define/create a new measurement group object to save the average measured times */\n    static createMeasureGroup(name:string, measurement_names:string[]=[]){\n        const obj = Object.fromEntries(measurement_names.map(n=>[n,0]));\n        const group = DatexObject.seal({[this.MEAS_COUNT]:obj, ...obj})\n        this.#measurements_groups.set(name, group)\n        return group;\n    }\n\n    // get a measure group object (DatexObject) for a previously defined measure group\n    static getMeasureGroup(name:string){\n        return this.#measurements_groups.get(name)\n    }\n\n    static startMeasure(group:string, name:string):PerformanceMark{\n        if (!globalThis.performance?.getEntriesByName || !RuntimePerformance.enabled) return;\n        if (!this.#measurements_groups.has(group)) throw new Error(\"Measurement group '\"+group+\"' is not defined\");\n\n        const count = (this.#marker_count.get(name)??0);\n        this.#marker_count.set(name, count+1)\n\n        const marker = globalThis.performance.mark(group+'_'+name+'_'+count, {detail:{group, name}})\n\n        return marker;\n    }\n\n    static endMeasure(mark:string|PerformanceMark){\n        if (!globalThis.performance?.getEntriesByName || !RuntimePerformance.enabled) return;\n        const performance_mark = mark instanceof PerformanceMark ? mark : <PerformanceMark> globalThis.performance.getEntriesByName(mark, 'mark')[0];\n        const mark_name = performance_mark.name;\n        const name = performance_mark.detail.name;\n        if (!performance_mark.detail.group) throw new Error(\"Performance mark has no assigned measurment group\");\n\n        const duration = globalThis.performance.measure(mark_name, mark_name).duration;\n        const group = this.#measurements_groups.get(performance_mark.detail.group)\n        const count = ++group[this.MEAS_COUNT][name];\n\n        // calculate new average value\n        group[name] = group[name] + (duration - group[name]) / count;\n\n        return group\n    }\n}\n\nglobalThis.DatexRuntimePerformance = RuntimePerformance;\n"],"names":["DatexObject","RuntimePerformance","enabled","marker","description","new_marker","start_marker","globalThis","performance","getEntriesByName","length","mark","measure","Map","MEAS_COUNT","Symbol","createMeasureGroup","name","measurement_names","obj","Object","fromEntries","map","n","group","seal","set","getMeasureGroup","get","startMeasure","has","Error","count","detail","endMeasure","performance_mark","PerformanceMark","mark_name","duration","DatexRuntimePerformance"],"mappings":"AAEA,SAASA,WAAW,QAAQ,qBAAqB;AAKjD,OAAO,MAAMC;IAET,OAAOC,UAAU,CAAA,EAAM;IAIvB,OAAOC,OAAOC,WAAkB,EAAEC,UAAiB,EAAEC,YAAmB,EAAC;QAChEC,WAAWC,WAAW,EAAEC,qBACxBF,WAAWC,WAAW,CAACC,gBAAgB,CAAC,iBAAiBC,MAAM,IAAEH,WAAWC,WAAW,CAACG,IAAI,CAAC,kBAGlGJ,WAAWC,WAAW,CAACG,IAAI,CAACN,aAC5BE,WAAWC,WAAW,CAACI,OAAO,CAFZN,eAAa,MAAID,YAEOC;IAI9C;IAEA,OAAO,CAAA,YAAa,GAAG,IAAIO,MAAqB;IAEhD,OAAO,CAAA,mBAAoB,GAAG,IAAIA,MAAqB;IAEvD,OAAOC,aAAaC,OAAO,cAAa;IAGxC,OAAOC,mBAAmBC,IAAW,EAAEC,oBAA2B,EAAE,EAAC;QACjE,IAAMC,MAAMC,OAAOC,WAAW,CAACH,kBAAkBI,GAAG,CAACC,CAAAA,IAAG;gBAACA;gBAAE;aAAE,IACvDC,QAAQxB,YAAYyB,IAAI,CAAC;YAAC,CAAC,IAAI,CAACX,UAAU,CAAC,EAACK;YAAK,GAAGA,GAAG;QAAA;QAE7D,OADA,IAAI,CAAC,CAAA,mBAAoB,CAACO,GAAG,CAACT,MAAMO,QAC7BA;IACX;IAGA,OAAOG,gBAAgBV,IAAW,EAAC;QAC/B,OAAO,IAAI,CAAC,CAAA,mBAAoB,CAACW,GAAG,CAACX;IACzC;IAEA,OAAOY,aAAaL,KAAY,EAAEP,IAAW,EAAiB;QAC1D,IAAI,CAACV,WAAWC,WAAW,EAAEC,oBAAoB,CAACR,mBAAmBC,OAAO,EAAE;QAC9E,IAAI,CAAC,IAAI,CAAC,CAAA,mBAAoB,CAAC4B,GAAG,CAACN,QAAQ,MAAM,AAAIO,MAAM,wBAAsBP,QAAM;QAEvF,IAAMQ,QAAS,IAAI,CAAC,CAAA,YAAa,CAACJ,GAAG,CAACX,SAAO;QAK7C,OAJA,IAAI,CAAC,CAAA,YAAa,CAACS,GAAG,CAACT,MAAMe,QAAM,IAEpBzB,WAAWC,WAAW,CAACG,IAAI,CAACa,QAAM,MAAIP,OAAK,MAAIe,OAAO;YAACC,QAAO;gBAACT;gBAAOP;YAAI;QAAC;IAG9F;IAEA,OAAOiB,WAAWvB,IAA2B,EAAC;QAC1C,IAAI,CAACJ,WAAWC,WAAW,EAAEC,oBAAoB,CAACR,mBAAmBC,OAAO,EAAE;QAC9E,IAAMiC,mBAAmBxB,gBAAgByB,kBAAkBzB,OAAyBJ,WAAWC,WAAW,CAACC,gBAAgB,CAACE,MAAM,OAAO,CAAC,EAAE,EACtI0B,YAAYF,iBAAiBlB,IAAI,EACjCA,OAAOkB,iBAAiBF,MAAM,CAAChB,IAAI;QACzC,IAAI,CAACkB,iBAAiBF,MAAM,CAACT,KAAK,EAAE,MAAM,AAAIO,MAAM;QAEpD,IAAMO,WAAW/B,WAAWC,WAAW,CAACI,OAAO,CAACyB,WAAWA,WAAWC,QAAQ,EACxEd,QAAQ,IAAI,CAAC,CAAA,mBAAoB,CAACI,GAAG,CAACO,iBAAiBF,MAAM,CAACT,KAAK,GACnEQ,QAAQ,EAAER,KAAK,CAAC,IAAI,CAACV,UAAU,CAAC,CAACG,KAAK;QAK5C,OAFAO,KAAK,CAACP,KAAK,GAAGO,KAAK,CAACP,KAAK,GAAG,AAACqB,CAAAA,WAAWd,KAAK,CAACP,KAAK,AAAD,IAAKe,OAEhDR;IACX;AACJ;AAEAjB,WAAWgC,uBAAuB,GAAGtC","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/runtime/","file":"performance_measure.ts"}