X Tutup
Skip to content

Commit 24e647e

Browse files
committed
perf(render): precompute # bound text nodes and root nodes in DomProtoView
1 parent 9cd510a commit 24e647e

File tree

3 files changed

+17
-10
lines changed

3 files changed

+17
-10
lines changed

modules/angular2/src/dom/html_adapter.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ class Html5LibDomAdapter implements DomAdapter {
102102
throw 'not implemented';
103103
}
104104
content(node) {
105-
throw 'not implemented';
105+
return node;
106106
}
107107

108108
firstChild(el) => el is NodeList ? el.first : el.firstChild;

modules/angular2/src/render/dom/dom_renderer.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,11 @@ export class DomRenderer extends Renderer {
224224
rootElementClone = DOM.importIntoDoc(DOM.content(protoView.element));
225225
elementsWithBindingsDynamic =
226226
DOM.querySelectorAll(rootElementClone, NG_BINDING_CLASS_SELECTOR);
227-
var childNode = DOM.firstChild(rootElementClone);
228-
// TODO(perf): Should be fixed size, since we could pre-compute in in DomProtoView
229-
viewRootNodes = [];
227+
viewRootNodes = ListWrapper.createFixedSize(protoView.rootNodeCount);
230228
// Note: An explicit loop is the fastest way to convert a DOM array into a JS array!
231-
while (childNode != null) {
232-
ListWrapper.push(viewRootNodes, childNode);
233-
childNode = DOM.nextSibling(childNode);
229+
var childNode = DOM.firstChild(rootElementClone);
230+
for (var i = 0; i < protoView.rootNodeCount; i++, childNode = DOM.nextSibling(childNode)) {
231+
viewRootNodes[i] = childNode;
234232
}
235233
} else {
236234
rootElementClone = DOM.importIntoDoc(protoView.element);
@@ -239,8 +237,9 @@ export class DomRenderer extends Renderer {
239237
}
240238

241239
var binders = protoView.elementBinders;
242-
var boundTextNodes = [];
240+
var boundTextNodes = ListWrapper.createFixedSize(protoView.boundTextNodeCount);
243241
var boundElements = ListWrapper.createFixedSize(binders.length);
242+
var boundTextNodeIdx = 0;
244243

245244
for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
246245
var binder = binders[binderIdx];
@@ -261,7 +260,7 @@ export class DomRenderer extends Renderer {
261260
// boundTextNodes
262261
var textNodeIndices = binder.textNodeIndices;
263262
for (var i = 0; i < textNodeIndices.length; i++) {
264-
ListWrapper.push(boundTextNodes, childNodes[textNodeIndices[i]]);
263+
boundTextNodes[boundTextNodeIdx++] = childNodes[textNodeIndices[i]];
265264
}
266265

267266
// contentTags

modules/angular2/src/render/dom/view/proto_view.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {isPresent} from 'angular2/src/facade/lang';
22
import {DOM} from 'angular2/src/dom/dom_adapter';
33

4-
import {List} from 'angular2/src/facade/collection';
4+
import {List, ListWrapper} from 'angular2/src/facade/collection';
55

66
import {ElementBinder} from './element_binder';
77
import {NG_BINDING_CLASS} from '../util';
@@ -27,6 +27,8 @@ export class DomProtoView {
2727
rootBindingOffset: number;
2828
// the number of content tags seen in this or any child proto view.
2929
transitiveContentTagCount: number;
30+
boundTextNodeCount: number;
31+
rootNodeCount: number;
3032

3133
constructor({elementBinders, element, transitiveContentTagCount}) {
3234
this.element = element;
@@ -35,5 +37,11 @@ export class DomProtoView {
3537
this.isTemplateElement = DOM.isTemplateElement(this.element);
3638
this.rootBindingOffset =
3739
(isPresent(this.element) && DOM.hasClass(this.element, NG_BINDING_CLASS)) ? 1 : 0;
40+
this.boundTextNodeCount =
41+
ListWrapper.reduce(elementBinders, (prevCount: number, elementBinder: ElementBinder) =>
42+
prevCount + elementBinder.textNodeIndices.length,
43+
0);
44+
this.rootNodeCount =
45+
this.isTemplateElement ? DOM.childNodes(DOM.content(this.element)).length : 1;
3846
}
3947
}

0 commit comments

Comments
 (0)
X Tutup