feat(benchmarks): tree benchmark baseline

This commit is contained in:
Tobias Bosch 2014-12-08 14:17:44 -08:00
parent 68da0012cc
commit e7de5f8f37
2 changed files with 99 additions and 1 deletions

View File

@ -1,3 +1,5 @@
$SCRIPTS$
<app></app>
<baseline></baseline>

View File

@ -11,6 +11,8 @@ import {DirectiveMetadataReader} from 'core/compiler/directive_metadata_reader';
import {TemplateLoader} from 'core/compiler/template_loader';
import {reflector} from 'reflection/reflection';
import {DOM, document, Element} from 'facade/dom';
import {isPresent} from 'facade/lang';
var MAX_DEPTH = 9;
@ -146,6 +148,28 @@ export function main() {
});
});
benchmark(`baseline tree benchmark`, function() {
var baselineAppElement = DOM.querySelectorAll(document, 'baseline')[0];
var rootTreeComponent = new BaseLineTreeComponent();
DOM.appendChild(baselineAppElement, rootTreeComponent.element);
var count = 0;
benchmarkStep(`destroyDom binary tree of depth ${MAX_DEPTH}`, function() {
rootTreeComponent.update(new TreeNode('', null, null));
});
benchmarkStep(`createDom binary tree of depth ${MAX_DEPTH}`, function() {
var maxDepth = 9;
var values = count++ % 2 == 0 ?
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*'] :
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', '-'];
rootTreeComponent.update(buildTree(maxDepth, values, 0));
});
});
}
class TreeNode {
@ -167,6 +191,78 @@ function buildTree(maxDepth, values, curDepth) {
buildTree(maxDepth, values, curDepth+1));
}
var BASELINE_TEMPLATE = DOM.createTemplate(`
<span> {{}}
<template class="ng-binding"></template>
<template class="ng-binding"></template>
</span>`);
class BaseLineTreeComponent {
element:Element;
value:BaseLineInterpolation;
left:BaseLineIf;
right:BaseLineIf;
constructor() {
this.element = DOM.createElement('span');
var clone = DOM.clone(BASELINE_TEMPLATE.content.children[0]);
var shadowRoot = this.element.createShadowRoot();
DOM.appendChild(shadowRoot, clone);
this.value = new BaseLineInterpolation(clone.childNodes[0]);
this.left = new BaseLineIf(clone.children[0]);
this.right = new BaseLineIf(clone.children[1]);
}
update(value:TreeNode) {
this.value.update(value.value);
this.left.update(value.left);
this.right.update(value.right);
}
}
class BaseLineInterpolation {
value:string;
textNode;
constructor(textNode) {
this.value = null;
this.textNode = textNode;
}
update(value:string) {
if (this.value !== value) {
this.value = value;
DOM.setText(this.textNode, value + ' ');
}
}
}
class BaseLineIf {
condition:boolean;
component:BaseLineTreeComponent;
anchor:Element;
constructor(anchor) {
this.anchor = anchor;
this.condition = false;
this.component = null;
}
update(value:TreeNode) {
var newCondition = isPresent(value);
if (this.condition !== newCondition) {
this.condition = newCondition;
if (isPresent(this.component)) {
this.component.element.remove();
this.component = null;
}
if (this.condition) {
this.component = new BaseLineTreeComponent();
this.anchor.parentNode.insertBefore(this.component.element, this.anchor);
}
}
if (isPresent(this.component)) {
this.component.update(value);
}
}
}
class AppComponent {
initData:TreeNode;
constructor() {