@@ -18,41 +18,43 @@ export const VIEW_POOL_CAPACITY = 'render.ViewFactory.viewPoolCapacity';
1818
1919@Injectable ( )
2020export class ViewFactory {
21- _poolCapacity :number ;
22- _pooledViews : List < viewModule . RenderView > ;
21+ _poolCapacityPerProtoView :number ;
22+ _pooledViewsPerProtoView : Map < pvModule . RenderProtoView , List < viewModule . RenderView > >;
2323 _eventManager :EventManager ;
2424 _shadowDomStrategy :ShadowDomStrategy ;
2525
26- constructor ( @Inject ( VIEW_POOL_CAPACITY ) capacity , eventManager :EventManager , shadowDomStrategy :ShadowDomStrategy ) {
27- this . _poolCapacity = capacity ;
28- this . _pooledViews = ListWrapper . create ( ) ;
26+ constructor ( @Inject ( VIEW_POOL_CAPACITY ) poolCapacityPerProtoView ,
27+ eventManager :EventManager , shadowDomStrategy :ShadowDomStrategy ) {
28+ this . _poolCapacityPerProtoView = poolCapacityPerProtoView ;
29+ this . _pooledViewsPerProtoView = MapWrapper . create ( ) ;
2930 this . _eventManager = eventManager ;
3031 this . _shadowDomStrategy = shadowDomStrategy ;
3132 }
3233
3334 getView ( protoView :pvModule . RenderProtoView ) :viewModule . RenderView {
34- // TODO(tbosch): benchmark this scanning of views and maybe
35- // replace it with a fancy LRU Map/List combination...
36- var view ;
37- for ( var i = this . _pooledViews . length - 1 ; i >= 0 ; i -- ) {
38- var pooledView = this . _pooledViews [ i ] ;
39- if ( pooledView . proto === protoView ) {
40- view = ListWrapper . removeAt ( this . _pooledViews , i ) ;
35+ var pooledViews = MapWrapper . get ( this . _pooledViewsPerProtoView , protoView ) ;
36+ if ( isPresent ( pooledViews ) ) {
37+ var result = ListWrapper . removeLast ( pooledViews ) ;
38+ if ( pooledViews . length === 0 ) {
39+ MapWrapper . delete ( this . _pooledViewsPerProtoView , protoView ) ;
4140 }
41+ return result ;
4242 }
43- if ( isBlank ( view ) ) {
44- view = this . _createView ( protoView ) ;
45- }
46- return view ;
43+ return this . _createView ( protoView ) ;
4744 }
4845
4946 returnView ( view :viewModule . RenderView ) {
5047 if ( view . hydrated ( ) ) {
5148 view . dehydrate ( ) ;
5249 }
53- ListWrapper . push ( this . _pooledViews , view ) ;
54- while ( this . _pooledViews . length > this . _poolCapacity ) {
55- ListWrapper . removeAt ( this . _pooledViews , 0 ) ;
50+ var protoView = view . proto ;
51+ var pooledViews = MapWrapper . get ( this . _pooledViewsPerProtoView , protoView ) ;
52+ if ( isBlank ( pooledViews ) ) {
53+ pooledViews = [ ] ;
54+ MapWrapper . set ( this . _pooledViewsPerProtoView , protoView , pooledViews ) ;
55+ }
56+ if ( pooledViews . length < this . _poolCapacityPerProtoView ) {
57+ ListWrapper . push ( pooledViews , view ) ;
5658 }
5759 }
5860
0 commit comments