Если ваш код не вызовет бесконечную рекурсию/циклы, то проблем не будет.
В отличие от $timeout, будет работать быстрее, т.к. с $timeout будет происходить +1 перерисовка, заново запускается $digest, ну и все это откладывается по времени. Хотя в большинстве случаев это все мелочи.
Если track by не указан, значит работает по умолчанию "track by $id(item)" который генерирует "$$hashKey".
Суть в том что Ангуляру нужно как-то сопоставить элемент массива и DOM, в итоге для элемента массива используется какой-то индетификатор (note.id / hashkey / $index / ...), когда массив изменится Ангуляр по этому идентификатору сможет найти соответсвующий DOM для этого элемента массива, если DOM элемент не найден, то считается что элемент массива новый и под него создается свой DOM и scope, которые опять же привязываются к идентификатору.
В итоге, что-бы было минимум перестроений DOM, нужно делать так что-бы идентификаторы сохранялись от $digest до $digest, для этого есть несколько режимов track by.
Есть предположение что это IO "тормозит", поставте какой-нибуть io-монитор, и посмотрите на момент "тормозов".
Однажды наблюдал подобную ситуацию - один линуксовый процесс периодический насиловал диск, при этом забивал IO.
У вас на ssh или обычное хранилище?
Так же на хосте должно быть как минимум 2Гб оперативы.
Гляньте на Angular (Light), с ним пример попроще. al-click="value=!value" - инвертируем value при клике. al-checked="value" - устанавливаем/получаем значение, для checkbox.
Можно ещё ("хардкорный") вариант рассмотреть (может подойти для некоторых случаев):
В посте храним идентификатор автора, передает клиенту пост как есть, а на клиенте подставляем автора из кеша, если в кеше нет, то подгружаем с сервера.
Как выше сказали - оптимизировать рано, поэтому для начала я бы взял 2 вариант.
Вы можете проверить конкретный случай, например пометить один элемент, например изменить текст/цвет. После чего спровоцировать "перерисовку", если все отработает корректно, а текст/цвет останется, то этот элемент был не тронут (не "пересоздан").
ng-repeat создает соответствия элемент массива <-> элемент DOM, на подобии match[ $id(model) ] = element, если при следующей "перерисовке" нет DOM элемента для элемента массива match[ $id(model) ] == null, то создается новый DOM элемент. "Ключ $id(model)" можно изменить через track by.
Это просто цифра в вакууме - число $watch объектов при котором могло начать подтормаживать приложение средней солжности на старом компе (когда там этот подсчет делали...) и старой версии Angular.js
Последняя версия Angular.js ускорилась в разы, мощность компов выросла, у меня на среднем ноутбуке Angular.js "отмолачивает" 11M простых $watch объектов в секунду!