{{data0}}
{{data1}}
{{data2}}
Created by 손찬욱 / chanuk.son
개발자의 생산성 짱!
이 발표는 성능 이슈에 대한 이야기입니다.
독립된 Directive 내에서의 Two-Way Data Binding
실시간 으로 각각의 영역을 갱신해야하는 경우, 성능 이슈 발생
헉~! 클릭이 안될 정도로 느려요
이럴 때 써라고 있는 거 아닌가요???
누구(View or Model)를, 언제(변경시점) 갱신할 것 인가?
$scope.$watch(watchExpression, listener, [objectEquality]);
주기적으로 데이터 변경 여부를 확인하는 방법
데이터에 값이 설정되어 변경되는 시점에 확인
- DOM 이벤트(ng-click, ng-mousedown, ng-change, …)가 발생한 후
- $http와 $resource에서 응답이 돌아왔을 경우
- $location에서 URL을 변경한 후
- $timeout이벤트가 발생한 후
- $scope.$apply()나 $scope.$digest()가 호출될 때
Digest Loop는 최소 2번. 최대 10번이 호출
$scope.$watch(watchExpression, listener, [objectEquality]);
함수 watchExpression의 반환값이 'true'이면 listener 호출
watch대상 확인시, 매번 watchExpression이 호출된다.
Scope당 수행시간 = 각 watch의 watchExpression 수행시간 * n
한 번의 Digest Loop의 수행시간 = scope당 수행시간 * s
총 수행시간 = 각 watch의 watchExpression 수행시간 * n * s * (2~10)
총 수행시간 = 각 watch의 watchExpression 수행시간 * n * s * (2~10)
총 수행시간 = 각 watch의 watchExpression 수행시간 * n * s * (2~10)
5ms * 4(watch대상) * 4(scope개수) * 2 = 160ms
Two-Way Data Binding이 아닌, Event Driven 방식을 이용하거나
Throttling 기법을 이용하는 것도 좋은 방법
{{data0}}
{{data1}}
{{data2}}
{{data0}}
{{data1}}
{{data2}}
Jindo
Jindo Mobile Component
Jindo Component
HTML from Server
- compile phase
Template from DOM
- link phase
View from Template
페이지 로딩 도중 초기 DOM이나 Template이 노출되는 경우
.ng-cloak, .x-ng-cloak { display: none !important; }
분명히, 성능적인 면에서는 몇가지 문제가 있습니다.
ECMAScript7 Object.observer()
Browser Performance