1

최근에 AngularJS 앱을 개발하면서 시계와 관련된 성능 문제가 발생 했으므로 양방향 데이터 바인딩을 사용하여 더티 검사 알고리즘의 시간 복잡도가 더 무엇인지 궁금합니다. 그것의 외모에서, 모든 이벤트가 끝나면 digurn cycle이 있습니다. inturn은 watch cycle을 호출하므로, 이것은 O (n^2)이어야합니다 ... 이것이 맞습니까?AngularJS의 더티 검사 알고리즘의 시간 복잡도는 얼마나됩니까?

답변

1

더러운 검사는 $diggest주기에서 발생하므로 $diggest주기의 복잡성을 조사해야합니다.

주기는 모델의 변경 사항이 완료되었음을 보장하는 단계입니다 ( ). 그러면 업데이트 된 변경 내용으로보기가 렌더링 될 수 있습니다. 이를 수행하기 위해 각도는 각 반복이 $scope$watcher 함수뿐만 아니라 뷰의 모든 템플릿 표현식 을 평가하는 루프를 시작합니다. 현재 반복에서 결과가 이전 반복과 동일하면 이면 각도가 루프를 종료합니다. 그렇지 않으면 다시 시도합니다. 10 번 시도한 후에도 문제가 해결되지 않으면 Angular는 을 종료하고 오류 : "Infite $diggest Loop Error" (infdig)을 종료합니다.

따라서 더티 검사의 복잡성은 $watcher과보기의 표현 (예 : $filter)에있는 기능의 복잡성을 저해 할 것입니다.

그래서 혼자 $diggest주기는 n$watcher s와 반복 할 필요가 템플릿 표현식 오 숫자가 O(n)의 복잡성을 가지고있다. 하지만 그런 기능의 복잡성을 고려해야합니다. 또한 $diggest주기는 항상 모든 기능을 최소한 두 번 방문하므로 (변경 사항이 안정화되었는지 확인하기 위해)보다 정확하게하려면 O(n*2) 이상의 복잡성이 있다고 말할 수 있습니다. O(n*10)의 최대 복잡성이지만 2는 최대 값이 10 인 상수 값이기 때문에 복잡도는 여전히 O(n)으로 간주되어야합니다.

관련 문제