Skip to content

Commit 534cbb4

Browse files
Tim Blasimhevery
authored andcommitted
refactor(benchmarks): Update compile benchmarks
Update the compile benchmark to allow the Dart transformer to properly generate the getters, setters, & methods needed. This also improves the method of duplicating the source templates, further decreasing runtime from ~5s to ~2s.
1 parent d9ceb42 commit 534cbb4

File tree

2 files changed

+85
-95
lines changed

2 files changed

+85
-95
lines changed

modules/benchmarks/src/compiler/compiler_benchmark.html

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,7 @@ <h2>Actions</h2>
1515
<button id="compileWithBindings">CompileWithBindings</button>
1616
<button id="compileNoBindings">CompileNoBindings</button>
1717
</p>
18-
19-
<template id="templateNoBindings">
20-
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
21-
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
22-
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
23-
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
24-
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
25-
</div>
26-
</div>
27-
</div>
28-
</div>
29-
</div>
30-
</template>
31-
32-
<template id="templateWithBindings">
33-
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
34-
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
35-
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
36-
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
37-
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
38-
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
39-
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
40-
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
41-
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
42-
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
43-
</div>
44-
</div>
45-
</div>
46-
</div>
47-
</div>
48-
</template>
49-
5018
$SCRIPTS$
5119

5220
</body>
53-
</html>
21+
</html>

modules/benchmarks/src/compiler/compiler_benchmark.js

Lines changed: 84 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import {DOM} from 'angular2/src/dom/dom_adapter';
21
import {BrowserDomAdapter} from 'angular2/src/dom/browser_adapter';
3-
import {Type} from 'angular2/src/facade/lang';
4-
import {document} from 'angular2/src/facade/browser';
2+
import {PromiseWrapper} from 'angular2/src/facade/async';
3+
import {ListWrapper, MapWrapper} from 'angular2/src/facade/collection';
4+
import {DateWrapper, Type, print} from 'angular2/src/facade/lang';
55
import {NativeShadowDomStrategy} from 'angular2/src/render/dom/shadow_dom/native_shadow_dom_strategy';
66

77
import {Parser, Lexer, DynamicChangeDetection} from 'angular2/change_detection';
@@ -25,41 +25,15 @@ import {getIntParameter, bindAction} from 'angular2/src/test_lib/benchmark_util'
2525
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
2626
import * as rc from 'angular2/src/render/dom/compiler/compiler';
2727

28-
function setupReflector() {
29-
reflector.reflectionCapabilities = new ReflectionCapabilities();
30-
31-
reflector.registerGetters({
32-
"inter0": (a) => a.inter0, "inter1": (a) => a.inter1,
33-
"inter2": (a) => a.inter2, "inter3": (a) => a.inter3, "inter4": (a) => a.inter4,
34-
35-
"value0": (a) => a.value0, "value1": (a) => a.value1,
36-
"value2": (a) => a.value2, "value3": (a) => a.value3, "value4": (a) => a.value4,
37-
38-
"prop" : (a) => a.prop
39-
});
40-
41-
reflector.registerSetters({
42-
"inter0": (a,v) => a.inter0 = v, "inter1": (a,v) => a.inter1 = v,
43-
"inter2": (a,v) => a.inter2 = v, "inter3": (a,v) => a.inter3 = v, "inter4": (a,v) => a.inter4 = v,
44-
45-
"value0": (a,v) => a.value0 = v, "value1": (a,v) => a.value1 = v,
46-
"value2": (a,v) => a.value2 = v, "value3": (a,v) => a.value3 = v, "value4": (a,v) => a.value4 = v,
47-
48-
"attr0": (a,v) => a.attr0 = v, "attr1": (a,v) => a.attr1 = v,
49-
"attr2": (a,v) => a.attr2 = v, "attr3": (a,v) => a.attr3 = v, "attr4": (a,v) => a.attr4 = v,
50-
51-
"prop": (a,v) => a.prop = v
52-
});
53-
}
54-
5528
export function main() {
5629
BrowserDomAdapter.makeCurrent();
5730
var count = getIntParameter('elements');
5831

59-
setupReflector();
32+
reflector.reflectionCapabilities = new ReflectionCapabilities();
6033
var reader = new DirectiveResolver();
6134
var cache = new CompilerCache();
62-
var templateResolver = new FakeTemplateResolver();
35+
var templateResolver = new MultipleTemplateResolver(
36+
count, [BenchmarkComponentNoBindings, BenchmarkComponentWithBindings]);
6337
var urlResolver = new UrlResolver();
6438
var styleUrlResolver = new StyleUrlResolver(urlResolver);
6539
var shadowDomStrategy = new NativeShadowDomStrategy(styleUrlResolver);
@@ -75,33 +49,34 @@ export function main() {
7549
renderCompiler,
7650
new ProtoViewFactory(new DynamicChangeDetection(null))
7751
);
78-
var templateNoBindings = createTemplateHtml('templateNoBindings', count);
79-
var templateWithBindings = createTemplateHtml('templateWithBindings', count);
52+
53+
function measureWrapper(func, desc) {
54+
return function() {
55+
var begin = DateWrapper.now();
56+
print(`[${desc}] Begin...`);
57+
var onSuccess = function(_) {
58+
var elapsedMs = DateWrapper.toMillis(
59+
DateWrapper.now()) - DateWrapper.toMillis(begin);
60+
print(`[${desc}] ...done, took ${elapsedMs} ms`);
61+
};
62+
PromiseWrapper.then(func(), onSuccess, null);
63+
};
64+
}
8065

8166
function compileNoBindings() {
82-
templateResolver.setTemplateHtml(templateNoBindings);
8367
cache.clear();
84-
compiler.compile(BenchmarkComponent);
68+
return compiler.compile(BenchmarkComponentNoBindings);
8569
}
8670

8771
function compileWithBindings() {
88-
templateResolver.setTemplateHtml(templateWithBindings);
8972
cache.clear();
90-
compiler.compile(BenchmarkComponent);
73+
return compiler.compile(BenchmarkComponentWithBindings);
9174
}
9275

93-
bindAction('#compileNoBindings', compileNoBindings);
94-
bindAction('#compileWithBindings', compileWithBindings);
95-
}
96-
97-
function createTemplateHtml(templateId, repeatCount) {
98-
var template = DOM.querySelectorAll(document, `#${templateId}`)[0];
99-
var content = DOM.getInnerHTML(template);
100-
var result = '';
101-
for (var i=0; i<repeatCount; i++) {
102-
result += content;
103-
}
104-
return result;
76+
bindAction('#compileNoBindings',
77+
measureWrapper(compileNoBindings, 'No Bindings'));
78+
bindAction('#compileWithBindings',
79+
measureWrapper(compileWithBindings, 'With Bindings'));
10580
}
10681

10782
@Directive({
@@ -152,24 +127,71 @@ class Dir4 {
152127
constructor(dir3:Dir3) {}
153128
}
154129

155-
@Component()
156-
class BenchmarkComponent {}
130+
class MultipleTemplateResolver extends TemplateResolver {
131+
_multiple: num;
132+
_cache: Map;
157133

158-
class FakeTemplateResolver extends TemplateResolver {
159-
_template: View;
160-
161-
constructor() {
134+
constructor(multiple: num, components: List) {
162135
super();
136+
this._multiple = multiple;
137+
this._cache = MapWrapper.create();
138+
ListWrapper.forEach(components, (c) => this._warmUp(c));
163139
}
164140

165-
setTemplateHtml(html: string) {
166-
this._template = new View({
167-
template: html,
168-
directives: [Dir0, Dir1, Dir2, Dir3, Dir4]
169-
});
141+
_warmUp(component: Type) {
142+
var view = super.resolve(component);
143+
var multiplier = ListWrapper.createFixedSize(this._multiple);
144+
for (var i = 0; i < this._multiple; ++i) {
145+
multiplier[i] = view.template;
146+
}
147+
MapWrapper.set(this._cache, component, ListWrapper.join(multiplier, ''));
170148
}
171149

172150
resolve(component: Type): View {
173-
return this._template;
151+
var view = super.resolve(component);
152+
var myView = new View({
153+
template: MapWrapper.get(this._cache, component),
154+
directives: view.directives
155+
});
156+
return myView;
174157
}
175158
}
159+
160+
@Component()
161+
@View({
162+
directives: [Dir0, Dir1, Dir2, Dir3, Dir4],
163+
template: `
164+
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
165+
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
166+
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
167+
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
168+
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
169+
</div>
170+
</div>
171+
</div>
172+
</div>
173+
</div>`
174+
})
175+
class BenchmarkComponentNoBindings {}
176+
177+
@Component()
178+
@View({
179+
directives: [Dir0, Dir1, Dir2, Dir3, Dir4],
180+
template: `
181+
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
182+
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
183+
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
184+
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
185+
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
186+
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
187+
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
188+
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
189+
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
190+
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
191+
</div>
192+
</div>
193+
</div>
194+
</div>
195+
</div>`
196+
})
197+
class BenchmarkComponentWithBindings {}

0 commit comments

Comments
 (0)