angular / angular.js

AngularJS - HTML enhanced for web apps!
https://angularjs.org
MIT License
58.8k stars 27.49k forks source link

ng-animation slowly with ng-repeat #12678

Closed kimx closed 6 years ago

kimx commented 9 years ago

Hello I have a array that contain 500 items.First time it render by ng-repeat is faster but when it get data from backend server again that render slowly. I try some tip from other site suggestion like used 'track by'.But it cannot be improve.

Finally I used chrome profile tool record to find out .As below photo.The root cause seems by ng-animate.When I remove ng-animate from module the render time from 4300 ms to 100 ms. ng-animation-slowly

example slowly ng-repeat

faster ng-repeat

ps: For second plunkr I just remove ng-animate from module

Please help the Issue,thank you very much.

matsko commented 9 years ago

We do have a fix that does speed this up at least twice for 1.4.5

(slowly) http://plnkr.co/edit/qRl4IAHRPfpBVgiq34Xg?p=preview

(somewhat faster) http://plnkr.co/edit/ELyqLggWtCaVoGfskvrD?p=preview

Once 1.4.5 is out later this week we can look into speeding up.

kimx commented 9 years ago

Hi @matsko
I just try your faster sample,but It just speeding up for about 1000ms.That is not far than remove ng-animate from module or used animateProvider.classFilter

matsko commented 9 years ago

Yes exactly. There will be an effort to speed this up post 1.4.5.

kimx commented 9 years ago

Hi @matsko I am looking forward this coming release. Thanks a lot.

Narretz commented 8 years ago

This is unfortunately still slow, even in 1.5. Most of the time is lost in the loop that determines if an element is animatable. For that, it needs to make sure a) the element and its parents have $animate.enabled(true), b) the element is a child of the body and c) the element is a child of the app $rootElement. In an ngRepeat, this is done for each element, which takes a while. There is a micro optimization that I will put in a PR later, but it's not doing a lot.

What you can do is call $animate.enabled(el, false) on each element in the repeat, which will cut down the render time by a second or so:

http://plnkr.co/edit/SGuXzgU2u1ZFhBr0EZkT?p=preview

Narretz commented 8 years ago

Sorry, $animate.enabled(e, false) on the repeated element doesn't actually work because of ngRepeat / transclusion.

graingert commented 7 years ago

@Narretz I'm rendering angular components with jsdom, and calls to $animate seem to be taking the most time.

Is there any way to tell angular that no elements animate?

Narretz commented 7 years ago

@graingert Different ways, actually: https://code.angularjs.org/snapshot/docs/guide/animations#how-to-selectively-enable-disable-and-skip-animations

Does this help?

petebacondarwin commented 6 years ago

@Narretz says that #14166 could improve this performance when there are no animations running. But otherwise we are not going to be able to work on this further.