The main reason for this is the Angular dirty checking mechanism.
If one of the following 3 situations occurs on your page, "Angular" checks all your components in this tree structure in case there has been a change.
- Event listener. The DOM event listener can update the data in an Angular component and also trigger change detection.
- Macro and Micro tasks. setTimeout(), setInterval(), Promises...
- HTTP Data Request.(XHR requests.)
https://angular.io/guide/zone#when-apps-update-html
For example, you have an input element, and you entered a in this entry. Since this process is included in the scope of EVENT (change, keydown, keypress), Angular starts to control all components in the tree. Therefore, the more components you have, the more this process will turn into a nightmare after a while.
So what is the solution to this?
The solution could be "stop checking all components" for change elsewhere.
For this, you have to write all your components according to the change detection strategy. Since it is a very detailed topic, I'll just leave the key words here. Your components must be in the OnPush strategy.
https://angular.io/api/core/ChangeDetectionStrategy#OnPush
For more detailed information, you should review the change detection detector.
https://angular.io/api/core/ChangeDetectorRef
You can also use the ngDoCheck lifecycle for your performance testing. Your component will enter this cycle every time it is checked.
https://angular.io/api/core/DoCheck