2015-02-27 14:50:06 -08:00
|
|
|
import {BrowserDomAdapter} from 'angular2/src/dom/browser_adapter';
|
2015-05-12 11:03:14 -07:00
|
|
|
import {PromiseWrapper} from 'angular2/src/facade/async';
|
|
|
|
import {ListWrapper, MapWrapper} from 'angular2/src/facade/collection';
|
|
|
|
import {DateWrapper, Type, print} from 'angular2/src/facade/lang';
|
2015-04-07 20:54:20 -07:00
|
|
|
import {NativeShadowDomStrategy} from 'angular2/src/render/dom/shadow_dom/native_shadow_dom_strategy';
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-04-16 16:29:46 -07:00
|
|
|
import {Parser, Lexer, DynamicChangeDetection} from 'angular2/change_detection';
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-02-05 13:08:05 -08:00
|
|
|
import {Compiler, CompilerCache} from 'angular2/src/core/compiler/compiler';
|
2015-05-11 17:59:39 -07:00
|
|
|
import {DirectiveResolver} from 'angular2/src/core/compiler/directive_resolver';
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-04-28 18:17:00 -07:00
|
|
|
import {Component} from 'angular2/src/core/annotations_impl/annotations';
|
2015-04-30 13:38:40 -07:00
|
|
|
import {Directive} from 'angular2/src/core/annotations_impl/annotations';
|
2015-04-28 18:17:00 -07:00
|
|
|
import {View} from 'angular2/src/core/annotations_impl/view';
|
2015-04-02 14:40:49 -07:00
|
|
|
import {TemplateLoader} from 'angular2/src/render/dom/compiler/template_loader';
|
2015-02-12 14:44:59 +01:00
|
|
|
import {TemplateResolver} from 'angular2/src/core/compiler/template_resolver';
|
2015-04-02 09:52:00 -07:00
|
|
|
import {UrlResolver} from 'angular2/src/services/url_resolver';
|
2015-04-02 14:40:49 -07:00
|
|
|
import {StyleUrlResolver} from 'angular2/src/render/dom/shadow_dom/style_url_resolver';
|
2015-02-24 16:05:45 +01:00
|
|
|
import {ComponentUrlMapper} from 'angular2/src/core/compiler/component_url_mapper';
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-02-05 13:08:05 -08:00
|
|
|
import {reflector} from 'angular2/src/reflection/reflection';
|
2015-04-09 17:53:36 -07:00
|
|
|
import {ReflectionCapabilities} from 'angular2/src/reflection/reflection_capabilities';
|
2015-02-05 13:08:05 -08:00
|
|
|
import {getIntParameter, bindAction} from 'angular2/src/test_lib/benchmark_util';
|
2014-11-17 11:01:21 -08:00
|
|
|
|
2015-04-07 20:54:20 -07:00
|
|
|
import {ProtoViewFactory} from 'angular2/src/core/compiler/proto_view_factory';
|
|
|
|
import * as rc from 'angular2/src/render/dom/compiler/compiler';
|
|
|
|
|
2014-11-17 11:01:21 -08:00
|
|
|
export function main() {
|
2015-02-27 14:50:06 -08:00
|
|
|
BrowserDomAdapter.makeCurrent();
|
2015-01-09 18:00:04 -08:00
|
|
|
var count = getIntParameter('elements');
|
|
|
|
|
2015-05-12 11:03:14 -07:00
|
|
|
reflector.reflectionCapabilities = new ReflectionCapabilities();
|
2015-05-11 17:59:39 -07:00
|
|
|
var reader = new DirectiveResolver();
|
2014-12-22 17:50:10 -08:00
|
|
|
var cache = new CompilerCache();
|
2015-05-12 11:03:14 -07:00
|
|
|
var templateResolver = new MultipleTemplateResolver(
|
|
|
|
count, [BenchmarkComponentNoBindings, BenchmarkComponentWithBindings]);
|
2015-02-24 16:05:45 +01:00
|
|
|
var urlResolver = new UrlResolver();
|
|
|
|
var styleUrlResolver = new StyleUrlResolver(urlResolver);
|
2015-04-07 20:54:20 -07:00
|
|
|
var shadowDomStrategy = new NativeShadowDomStrategy(styleUrlResolver);
|
2015-05-06 10:17:38 -07:00
|
|
|
var renderCompiler = new rc.DefaultDomCompiler(
|
|
|
|
new Parser(new Lexer()), shadowDomStrategy, new TemplateLoader(null, urlResolver)
|
2015-04-07 20:54:20 -07:00
|
|
|
);
|
2015-02-24 16:05:45 +01:00
|
|
|
var compiler = new Compiler(
|
|
|
|
reader,
|
|
|
|
cache,
|
|
|
|
templateResolver,
|
|
|
|
new ComponentUrlMapper(),
|
2015-04-07 20:54:20 -07:00
|
|
|
urlResolver,
|
2015-05-06 10:17:38 -07:00
|
|
|
renderCompiler,
|
2015-04-13 09:50:02 -07:00
|
|
|
new ProtoViewFactory(new DynamicChangeDetection(null))
|
2015-03-02 15:02:48 +01:00
|
|
|
);
|
2015-05-12 11:03:14 -07:00
|
|
|
|
|
|
|
function measureWrapper(func, desc) {
|
|
|
|
return function() {
|
|
|
|
var begin = DateWrapper.now();
|
|
|
|
print(`[${desc}] Begin...`);
|
|
|
|
var onSuccess = function(_) {
|
|
|
|
var elapsedMs = DateWrapper.toMillis(
|
|
|
|
DateWrapper.now()) - DateWrapper.toMillis(begin);
|
|
|
|
print(`[${desc}] ...done, took ${elapsedMs} ms`);
|
|
|
|
};
|
|
|
|
PromiseWrapper.then(func(), onSuccess, null);
|
|
|
|
};
|
|
|
|
}
|
2014-12-22 17:50:10 -08:00
|
|
|
|
2015-01-09 18:00:04 -08:00
|
|
|
function compileNoBindings() {
|
2014-12-22 17:50:10 -08:00
|
|
|
cache.clear();
|
2015-05-12 11:03:14 -07:00
|
|
|
return compiler.compile(BenchmarkComponentNoBindings);
|
2014-12-22 17:50:10 -08:00
|
|
|
}
|
2014-11-17 11:01:21 -08:00
|
|
|
|
2015-01-09 18:00:04 -08:00
|
|
|
function compileWithBindings() {
|
2014-12-22 17:50:10 -08:00
|
|
|
cache.clear();
|
2015-05-12 11:03:14 -07:00
|
|
|
return compiler.compile(BenchmarkComponentWithBindings);
|
2014-12-22 17:50:10 -08:00
|
|
|
}
|
2014-11-17 20:47:05 -08:00
|
|
|
|
2015-05-12 11:03:14 -07:00
|
|
|
bindAction('#compileNoBindings',
|
|
|
|
measureWrapper(compileNoBindings, 'No Bindings'));
|
|
|
|
bindAction('#compileWithBindings',
|
|
|
|
measureWrapper(compileWithBindings, 'With Bindings'));
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
|
2015-04-30 13:38:40 -07:00
|
|
|
@Directive({
|
2014-11-14 14:03:03 -08:00
|
|
|
selector: '[dir0]',
|
2015-04-09 21:20:11 +02:00
|
|
|
properties: {
|
2015-02-17 21:55:18 +01:00
|
|
|
'prop': 'attr0'
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
class Dir0 {}
|
|
|
|
|
2015-04-30 13:38:40 -07:00
|
|
|
@Directive({
|
2014-11-14 14:03:03 -08:00
|
|
|
selector: '[dir1]',
|
2015-04-09 21:20:11 +02:00
|
|
|
properties: {
|
2015-02-17 21:55:18 +01:00
|
|
|
'prop': 'attr1'
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir1 {
|
|
|
|
constructor(dir0:Dir0) {}
|
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-04-30 13:38:40 -07:00
|
|
|
@Directive({
|
2014-11-14 14:03:03 -08:00
|
|
|
selector: '[dir2]',
|
2015-04-09 21:20:11 +02:00
|
|
|
properties: {
|
2015-02-17 21:55:18 +01:00
|
|
|
'prop': 'attr2'
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir2 {
|
|
|
|
constructor(dir1:Dir1) {}
|
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-04-30 13:38:40 -07:00
|
|
|
@Directive({
|
2014-11-14 14:03:03 -08:00
|
|
|
selector: '[dir3]',
|
2015-04-09 21:20:11 +02:00
|
|
|
properties: {
|
2015-02-17 21:55:18 +01:00
|
|
|
'prop': 'attr3'
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir3 {
|
|
|
|
constructor(dir2:Dir2) {}
|
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-04-30 13:38:40 -07:00
|
|
|
@Directive({
|
2014-11-14 14:03:03 -08:00
|
|
|
selector: '[dir4]',
|
2015-04-09 21:20:11 +02:00
|
|
|
properties: {
|
2015-02-17 21:55:18 +01:00
|
|
|
'prop': 'attr4'
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir4 {
|
|
|
|
constructor(dir3:Dir3) {}
|
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-05-12 11:03:14 -07:00
|
|
|
class MultipleTemplateResolver extends TemplateResolver {
|
|
|
|
_multiple: num;
|
|
|
|
_cache: Map;
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-05-12 11:03:14 -07:00
|
|
|
constructor(multiple: num, components: List) {
|
2015-02-12 14:44:59 +01:00
|
|
|
super();
|
2015-05-12 11:03:14 -07:00
|
|
|
this._multiple = multiple;
|
|
|
|
this._cache = MapWrapper.create();
|
|
|
|
ListWrapper.forEach(components, (c) => this._warmUp(c));
|
2015-02-12 14:44:59 +01:00
|
|
|
}
|
|
|
|
|
2015-05-12 11:03:14 -07:00
|
|
|
_warmUp(component: Type) {
|
|
|
|
var view = super.resolve(component);
|
|
|
|
var multiplier = ListWrapper.createFixedSize(this._multiple);
|
|
|
|
for (var i = 0; i < this._multiple; ++i) {
|
|
|
|
multiplier[i] = view.template;
|
|
|
|
}
|
|
|
|
MapWrapper.set(this._cache, component, ListWrapper.join(multiplier, ''));
|
2015-02-12 14:44:59 +01:00
|
|
|
}
|
|
|
|
|
2015-04-09 21:20:11 +02:00
|
|
|
resolve(component: Type): View {
|
2015-05-12 11:03:14 -07:00
|
|
|
var view = super.resolve(component);
|
|
|
|
var myView = new View({
|
|
|
|
template: MapWrapper.get(this._cache, component),
|
|
|
|
directives: view.directives
|
|
|
|
});
|
|
|
|
return myView;
|
2015-02-12 14:44:59 +01:00
|
|
|
}
|
|
|
|
}
|
2015-05-12 11:03:14 -07:00
|
|
|
|
|
|
|
@Component()
|
|
|
|
@View({
|
|
|
|
directives: [Dir0, Dir1, Dir2, Dir3, Dir4],
|
|
|
|
template: `
|
|
|
|
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
|
|
|
|
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
|
|
|
|
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
|
|
|
|
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
|
|
|
|
<div class="class0 class1 class2 class3 class4 " nodir0="" attr0="value0" nodir1="" attr1="value1" nodir2="" attr2="value2" nodir3="" attr3="value3" nodir4="" attr4="value4">
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>`
|
|
|
|
})
|
|
|
|
class BenchmarkComponentNoBindings {}
|
|
|
|
|
|
|
|
@Component()
|
|
|
|
@View({
|
|
|
|
directives: [Dir0, Dir1, Dir2, Dir3, Dir4],
|
|
|
|
template: `
|
|
|
|
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
|
|
|
|
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
|
|
|
|
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
|
|
|
|
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
|
|
|
|
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
|
|
|
|
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
|
|
|
|
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
|
|
|
|
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
|
|
|
|
<div class="class0 class1 class2 class3 class4 " dir0="" [attr0]="value0" dir1="" [attr1]="value1" dir2="" [attr2]="value2" dir3="" [attr3]="value3" dir4="" [attr4]="value4">
|
|
|
|
{{inter0}}{{inter1}}{{inter2}}{{inter3}}{{inter4}}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>`
|
|
|
|
})
|
|
|
|
class BenchmarkComponentWithBindings {}
|