There are two factors to take into account:
1. Frequency of change detection cycle calls
Angular fires the change detection cycle for pretty much any action, including callback functions that are called asynchronously (mousemove event handlers, setTimeout, setInterval callbacks, etc.). Even if the event handler is empty.
Any component that is not trivial will fire a stream of change detection cycles. So it's better to accept it and try to minimize code that is fired in ngDoCheck, ngAfterViewChecked. See also #2.
Most of the cycles are generated by the automatic width change detection code - which you can turn off using watchWidthChanges property (see https://api.daypilot.org/daypilot-scheduler-watchwidthchanges/).
It also fires the cycle on every mouse move but that is unavoidable.
2. Change detection speed
The Scheduler supports automatic input change detection ("config" and "events" attributes). The changes are detected in ngDoCheck using full object comparison. That is convenient but expensive.
One way to solve this is to require an immutable object and use a simple object identity comparison. That is fast but very inconvenient.
The Scheduler provides direct API for loading events and updating the configuration which is very efficient and it doesn't depend on the check cycle. So instead of forcing immutable objects as "events" and "config" values there are two options:
- use "events" and "config" for convenience when the data set is small
- switch to the direct API when you display large data sets (at least for event loading)
See also:
https://doc.daypilot.org/scheduler/angular-performance/