scichart
Version:
Fast WebGL JavaScript Charting Library and Framework
302 lines (301 loc) • 14.8 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.runAfterFramePaint = exports.PerformanceDebugHelper = exports.EPerformanceDebugLevel = exports.EPerformanceMarkType = void 0;
var guid_1 = require("./guid");
/**
* Performance debugging checkpoints enum
*/
var EPerformanceMarkType;
(function (EPerformanceMarkType) {
/**
* A surface creation start.
* @remarks used internally
*/
EPerformanceMarkType["InitializationStart"] = "InitializationStart";
/**
* A surface creation end.
* @remarks used internally
*/
EPerformanceMarkType["InitializationEnd"] = "InitializationEnd";
/**
* WASM engine fetching and initialization start.
* @remarks used internally.
*/
EPerformanceMarkType["EngineInitStart"] = "EngineInitStart";
/**
* WASM engine fetching and initialization end.
* @remarks used internally.
*/
EPerformanceMarkType["EngineInitEnd"] = "EngineInitEnd";
/**
* First surface invalidation in a sequence.
*
* @description
* Surface invalidation is triggered implicitly on data or property changes.
* Invalidating a surface means that it should rerender.
* Multiple calls of {@link SciChartSurfaceBase.invalidateElement} are batched based on the timing.
*
* @remarks used internally
*/
EPerformanceMarkType["LeadingInvalidate"] = "LeadingInvalidate";
/**
* Subsequent surface invalidation.
*
* @description
* The subsequent surface invalidation shouldn't affect rerender
* since it is enough to have a single `invalidate` call ({@link LeadingInvalidate})
* But it may be used to see the time and number of updates occurring.
*
* @remarks used internally.
*/
EPerformanceMarkType["Invalidate"] = "Invalidate";
/**
* DataSeries update start.
* @description
* Appending, inserting, removing data in DataSeries.
* @remarks used internally.
*/
EPerformanceMarkType["DataUpdateStart"] = "DataUpdateStart";
/**
* DataSeries update end.
* @remarks used internally.
*/
EPerformanceMarkType["DataUpdateEnd"] = "DataUpdateEnd";
/**
* Chart rendering start.
* @remarks used internally.
*/
EPerformanceMarkType["RenderStart"] = "RenderStart";
/**
* Chart rendering end.
* @remarks used internally.
*/
EPerformanceMarkType["RenderEnd"] = "RenderEnd";
/**
* Chart rendered.
* @description
* Represents a chart being rendered to an in between state that will be followed by another render.
* (In some rare cases it could mean that the resulting image may be ito be incomplete incorrect, outdated,
* or require another render iteration to make related calculations.)
*
* In this state the surface is invalidated, thus another render call is expected to follow.
* @remarks used internally.
*/
EPerformanceMarkType["Rendered"] = "Rendered";
/**
* Chart rendered.
* @description
* Represents a chart being rendered to a complete state.
* In this state the surface is NOT invalidated.
* Next render will happen after invalidation is triggered.
* @remarks used internally.
*/
EPerformanceMarkType["FullStateRendered"] = "FullStateRendered";
/**
* Chart was painted.
* @description
* Chart has been visually pained to pixels.
* @remarks used internally.
*/
EPerformanceMarkType["Painted"] = "Painted";
/**
* Chart element resizing.
* @remarks used internally.
*/
EPerformanceMarkType["Resize"] = "Resize";
/**
* Browser zoom change.
* @remarks used internally.
*/
EPerformanceMarkType["DpiChange"] = "DpiChange";
/**
* Chart initialization.
* @remarks
* used internally in `chartBuilder`.
* Otherwise, it is supposed to be used explicitly after the surface is created.
*/
EPerformanceMarkType["SetupStart"] = "SetupStart";
/**
* Chart initialization.
* @remarks
* used internally in `chartBuilder`.
* Otherwise, it is supposed to be used explicitly after the surface is created.
*/
EPerformanceMarkType["SetupEnd"] = "SetupEnd";
EPerformanceMarkType["CanvasInitializationStart"] = "CanvasInitializationStart";
EPerformanceMarkType["CanvasInitializationEnd"] = "CanvasInitializationEnd";
EPerformanceMarkType["AddSubSurfaceStart"] = "AddSubSurfaceStart";
EPerformanceMarkType["AddSubSurfaceEnd"] = "AddSubSurfaceEnd";
EPerformanceMarkType["RenderSurfaceDrawStart"] = "RenderSurfaceDrawStart";
EPerformanceMarkType["RenderSurfaceDrawEnd"] = "RenderSurfaceDrawEnd";
EPerformanceMarkType["DrawingLoopStart"] = "DrawingLoopStart";
EPerformanceMarkType["DrawingLoopEnd"] = "DrawingLoopEnd";
EPerformanceMarkType["CopyToCanvasStart"] = "CopyToCanvasStart";
EPerformanceMarkType["CopyToCanvasEnd"] = "CopyToCanvasEnd";
EPerformanceMarkType["GenericAnimationStart"] = "GenericAnimationStart";
EPerformanceMarkType["GenericAnimationEnd"] = "GenericAnimationEnd";
EPerformanceMarkType["AutoRangeStart"] = "AutoRangeStart";
EPerformanceMarkType["AutoRangeEnd"] = "AutoRangeEnd";
EPerformanceMarkType["LayoutStart"] = "LayoutStart";
EPerformanceMarkType["LayoutEnd"] = "LayoutEnd";
EPerformanceMarkType["GetTicksStart"] = "GetTicksStart";
EPerformanceMarkType["GetTicksEnd"] = "GetTicksEnd";
EPerformanceMarkType["DrawAxisBorderStart"] = "DrawAxisBorderStart";
EPerformanceMarkType["DrawAxisBorderEnd"] = "DrawAxisBorderEnd";
EPerformanceMarkType["DrawAxisBandsStart"] = "DrawAxisBandsStart";
EPerformanceMarkType["DrawAxisBandsEnd"] = "DrawAxisBandsEnd";
EPerformanceMarkType["DrawMinorGridLinesStart"] = "DrawMinorGridLinesStart";
EPerformanceMarkType["DrawMinorGridLinesEnd"] = "DrawMinorGridLinesEnd";
EPerformanceMarkType["DrawMajorGridLinesStart"] = "DrawMajorGridLinesStart";
EPerformanceMarkType["DrawMajorGridLinesEnd"] = "DrawMajorGridLinesEnd";
EPerformanceMarkType["DrawAxisBackgroundStart"] = "DrawAxisBackgroundStart";
EPerformanceMarkType["DrawAxisBackgroundEnd"] = "DrawAxisBackgroundEnd";
EPerformanceMarkType["DrawAxisLabelsStart"] = "DrawAxisLabelsStart";
EPerformanceMarkType["DrawAxisLabelsEnd"] = "DrawAxisLabelsEnd";
EPerformanceMarkType["DrawMinorTicksStart"] = "DrawMinorTicksStart";
EPerformanceMarkType["DrawMinorTicksEnd"] = "DrawMinorTicksEnd";
EPerformanceMarkType["DrawMajorTicksStart"] = "DrawMajorTicksStart";
EPerformanceMarkType["DrawMajorTicksEnd"] = "DrawMajorTicksEnd";
EPerformanceMarkType["DrawNativeTextStart"] = "DrawNativeTextStart";
EPerformanceMarkType["DrawNativeTextEnd"] = "DrawNativeTextEnd";
EPerformanceMarkType["DrawAnnotationStart"] = "DrawAnnotationStart";
EPerformanceMarkType["DrawAnnotationEnd"] = "DrawAnnotationEnd";
EPerformanceMarkType["ResampleSingleSeriesStart"] = "ResampleSingleSeriesStart";
EPerformanceMarkType["ResampleSingleSeriesEnd"] = "ResampleSingleSeriesEnd";
EPerformanceMarkType["DrawSingleSeriesStart"] = "DrawSingleSeriesStart";
EPerformanceMarkType["DrawSingleSeriesEnd"] = "DrawSingleSeriesEnd";
EPerformanceMarkType["DrawCollectionSeriesStart"] = "DrawCollectionSeriesStart";
EPerformanceMarkType["DrawCollectionSeriesEnd"] = "DrawCollectionSeriesEnd";
EPerformanceMarkType["PerformTextLayoutStart"] = "PerformTextLayoutStart";
EPerformanceMarkType["PerformTextLayoutEnd"] = "PerformTextLayoutEnd";
EPerformanceMarkType["DrawDataLabelsStart"] = "DrawDataLabelsStart";
EPerformanceMarkType["DrawDataLabelsEnd"] = "DrawDataLabelsEnd";
EPerformanceMarkType["PostDrawActionsStart"] = "PostDrawActionsStart";
EPerformanceMarkType["PostDrawActionsEnd"] = "PostDrawActionsEnd";
EPerformanceMarkType["PointerMoveStart"] = "PointerMoveStart";
EPerformanceMarkType["PointerMoveEnd"] = "PointerMoveEnd";
EPerformanceMarkType["PointerDownStart"] = "PointerDownStart";
EPerformanceMarkType["PointerDownEnd"] = "PointerDownEnd";
EPerformanceMarkType["PointerUpStart"] = "PointerUpStart";
EPerformanceMarkType["PointerUpEnd"] = "PointerUpEnd";
EPerformanceMarkType["ScrollStart"] = "ScrollStart";
EPerformanceMarkType["ScrollEnd"] = "ScrollEnd";
EPerformanceMarkType["DoubleClickStart"] = "DoubleClickStart";
EPerformanceMarkType["DoubleClickEnd"] = "DoubleClickEnd";
EPerformanceMarkType["MouseLeaveStart"] = "MouseLeaveStart";
EPerformanceMarkType["MouseLeaveEnd"] = "MouseLeaveEnd";
EPerformanceMarkType["MouseEnterStart"] = "MouseEnterStart";
EPerformanceMarkType["MouseEnterEnd"] = "MouseEnterEnd";
})(EPerformanceMarkType = exports.EPerformanceMarkType || (exports.EPerformanceMarkType = {}));
var EPerformanceDebugLevel;
(function (EPerformanceDebugLevel) {
EPerformanceDebugLevel[EPerformanceDebugLevel["Info"] = 0] = "Info";
EPerformanceDebugLevel[EPerformanceDebugLevel["Verbose"] = 1] = "Verbose";
})(EPerformanceDebugLevel = exports.EPerformanceDebugLevel || (exports.EPerformanceDebugLevel = {}));
/**
* @experimental
* An util used for adding performance checkpoints which can be then used for analyzing the chart performance.
* The checkpoints are created via the [Performance API](https://developer.mozilla.org/en-US/docs/Web/API/Performance)
* @remarks
* By default it is disabled, to make use of the utils set {@link PerformanceDebugHelper.enableDebug}.
* Some checkpoints are set implicitly.
* Custom checkpoints could be set using {@link PerformanceDebugHelper.mark}.
* To output the results use {@link PerformanceDebugHelper.outputLogs}.
*/
var PerformanceDebugHelper = /** @class */ (function () {
function PerformanceDebugHelper() {
this.separator = "_";
}
PerformanceDebugHelper.mark = function (type, options) {
if (!PerformanceDebugHelper.enableDebug)
return undefined;
return PerformanceDebugHelper.instance.addMark(type, options);
};
/** @inheritDoc {@link PerformanceDebugHelper.getMarks{} */
PerformanceDebugHelper.getMarks = function () {
return PerformanceDebugHelper.instance.getMarks();
};
PerformanceDebugHelper.clearMarks = function (name) {
return PerformanceDebugHelper.instance.clearMarks(name);
};
PerformanceDebugHelper.outputLogs = function () {
var allMarks = PerformanceDebugHelper.instance.getMarks();
allMarks.forEach(function (entry) {
console.log(entry.name, entry.startTime);
});
};
PerformanceDebugHelper.toJSON = function () {
var allMarks = PerformanceDebugHelper.instance.getMarks();
var serializedMarks = allMarks.map(function (_a) {
var name = _a.name, startTime = _a.startTime, detail = _a.detail;
return ({ name: name, startTime: startTime, detail: detail });
});
return { name: self.name, timeOrigin: performance.timeOrigin, marks: serializedMarks };
};
/**
* Retrieves the marks.
* @remarks the default implementation will return all PerformanceMark instances the browser's performance timeline (e.g. created via performance.mark)
*/
PerformanceDebugHelper.prototype.getMarks = function () {
return performance.getEntriesByType("mark");
};
/**
* Removes a specific mark by name or all marks if no name provided
* @remarks the default implementation removes marks the browser's performance timeline as well.
*/
PerformanceDebugHelper.prototype.clearMarks = function (name) {
performance.clearMarks(name);
};
/**
* Processes and creates a {@link TSciChartPerformanceMark} entry accordingly to provided {@link TPerformanceMarkOptions | options }.
* @remarks Make sure to provide a correct `level` option to define which marks are relevance. Default: EPerformanceDebugLevel.Info
*/
PerformanceDebugHelper.prototype.addMark = function (type, options) {
var _a;
var _b = options !== null && options !== void 0 ? options : { level: EPerformanceDebugLevel.Info }, level = _b.level, contextDetail = __rest(_b, ["level"]);
var debugLevel = level !== null && level !== void 0 ? level : EPerformanceDebugLevel.Info;
if (debugLevel <= PerformanceDebugHelper.debugLevel) {
var groupId = (_a = options === null || options === void 0 ? void 0 : options.relatedId) !== null && _a !== void 0 ? _a : (0, guid_1.generateGuid)();
contextDetail.relatedId = groupId;
return this.createMark(type, groupId, contextDetail);
}
return null;
};
/**
* Creates and returns {@link TSciChartPerformanceMark}
*
* @remarks default implementation adds mark to the browser's performance timeline.
* Alternatively, override this to add a mark to a separate collection without polluting the global object.
* [MDN Reference](https://developer.mozilla.org/docs/Web/API/PerformanceMark)
*/
PerformanceDebugHelper.prototype.createMark = function (type, groupId, detail) {
return performance.mark("".concat(type).concat(this.separator).concat(groupId), { detail: detail });
};
PerformanceDebugHelper.enableDebug = false;
PerformanceDebugHelper.debugLevel = EPerformanceDebugLevel.Info;
PerformanceDebugHelper.instance = new PerformanceDebugHelper();
return PerformanceDebugHelper;
}());
exports.PerformanceDebugHelper = PerformanceDebugHelper;
/**
* Runs `callback` shortly after the next browser Frame is produced.
*/
function runAfterFramePaint(callback) {
var messageChannel = new MessageChannel();
// Setup the callback to run in a Task
messageChannel.port1.onmessage = callback;
// Queue the Task on the Task Queue
messageChannel.port2.postMessage(undefined);
}
exports.runAfterFramePaint = runAfterFramePaint;
;