2016-08-26 15:44:05 -07:00
|
|
|
import {PromiseWrapper} from '@angular/facade/src/async';
|
|
|
|
import {ListWrapper, Map, MapWrapper} from '@angular/facade/src/collection';
|
|
|
|
import {DateWrapper, Type, isPresent, print} from '@angular/facade/src/lang';
|
2016-04-28 17:50:03 -07:00
|
|
|
import {bootstrap} from '@angular/platform-browser';
|
|
|
|
import {BrowserDomAdapter} from '@angular/platform-browser/src/browser/browser_adapter';
|
|
|
|
import {DOM} from '@angular/platform-browser/src/dom/dom_adapter';
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2016-08-26 15:44:05 -07:00
|
|
|
import {ComponentResolver, Component, Directive, ViewContainerRef,} from '@angular/core';
|
2015-09-24 14:51:19 -07:00
|
|
|
|
2016-08-16 13:59:06 -07:00
|
|
|
import {ViewMetadata} from '@angular/core/src/metadata/view';
|
|
|
|
|
2016-07-28 06:31:26 -07:00
|
|
|
import {CompilerConfig, DirectiveResolver} from '@angular/compiler';
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2016-04-28 17:50:03 -07:00
|
|
|
import {getIntParameter, bindAction} from '@angular/testing/src/benchmark_util';
|
2014-11-17 11:01:21 -08:00
|
|
|
|
2016-06-02 17:30:40 -07:00
|
|
|
function _createBindings(): any[] {
|
2015-09-24 14:51:19 -07:00
|
|
|
var multiplyTemplatesBy = getIntParameter('elements');
|
|
|
|
return [
|
2016-06-02 17:30:40 -07:00
|
|
|
{
|
2016-07-28 06:31:26 -07:00
|
|
|
provide: DirectiveResolver,
|
2016-08-26 15:44:05 -07:00
|
|
|
useFactory:
|
|
|
|
() => new MultiplyDirectiveResolver(
|
|
|
|
multiplyTemplatesBy, [BenchmarkComponentNoBindings, BenchmarkComponentWithBindings]),
|
2016-06-02 17:30:40 -07:00
|
|
|
deps: []
|
|
|
|
},
|
2016-01-06 14:13:44 -08:00
|
|
|
// Use interpretative mode as Dart does not support JIT and
|
|
|
|
// we want to be able to compare the numbers between JS and Dart
|
2016-08-26 15:44:05 -07:00
|
|
|
{
|
|
|
|
provide: CompilerConfig,
|
|
|
|
useValue: new CompilerConfig({genDebugInfo: false, useJit: false, logBindingUpdate: false})
|
|
|
|
}
|
2015-09-24 14:51:19 -07:00
|
|
|
];
|
|
|
|
}
|
2015-04-07 20:54:20 -07:00
|
|
|
|
2014-11-17 11:01:21 -08:00
|
|
|
export function main() {
|
2015-02-27 14:50:06 -08:00
|
|
|
BrowserDomAdapter.makeCurrent();
|
2016-08-26 15:44:05 -07:00
|
|
|
bootstrap(CompilerAppComponent, _createBindings()).then((ref) => {
|
|
|
|
var app = ref.instance;
|
|
|
|
bindAction('#compileNoBindings', measureWrapper(() => app.compileNoBindings(), 'No Bindings'));
|
|
|
|
bindAction(
|
|
|
|
'#compileWithBindings', measureWrapper(() => app.compileWithBindings(), 'With Bindings'));
|
|
|
|
});
|
2015-09-24 14:51:19 -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`);
|
2015-05-12 11:03:14 -07:00
|
|
|
};
|
2015-09-24 14:51:19 -07:00
|
|
|
var onError = function(e) { DOM.logError(e); };
|
|
|
|
PromiseWrapper.then(func(), onSuccess, onError);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2016-07-28 06:31:26 -07:00
|
|
|
class MultiplyDirectiveResolver extends DirectiveResolver {
|
2015-09-24 14:51:19 -07:00
|
|
|
_multiplyBy: number;
|
2015-10-05 16:02:21 -07:00
|
|
|
_cache = new Map<Type, ViewMetadata>();
|
2015-09-24 14:51:19 -07:00
|
|
|
|
|
|
|
constructor(multiple: number, components: Type[]) {
|
|
|
|
super();
|
|
|
|
this._multiplyBy = multiple;
|
2015-10-07 09:09:43 -07:00
|
|
|
components.forEach(c => this._fillCache(c));
|
2015-09-24 14:51:19 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
_fillCache(component: Type) {
|
|
|
|
var view = super.resolve(component);
|
|
|
|
var multipliedTemplates = ListWrapper.createFixedSize(this._multiplyBy);
|
|
|
|
for (var i = 0; i < this._multiplyBy; ++i) {
|
|
|
|
multipliedTemplates[i] = view.template;
|
|
|
|
}
|
|
|
|
this._cache.set(
|
|
|
|
component,
|
|
|
|
new ViewMetadata({template: multipliedTemplates.join(''), directives: view.directives}));
|
2015-05-12 11:03:14 -07:00
|
|
|
}
|
2014-12-22 17:50:10 -08:00
|
|
|
|
2015-09-24 14:51:19 -07:00
|
|
|
resolve(component: Type): ViewMetadata {
|
|
|
|
var result = this._cache.get(component);
|
|
|
|
return isPresent(result) ? result : super.resolve(component);
|
2014-12-22 17:50:10 -08:00
|
|
|
}
|
2015-09-24 14:51:19 -07:00
|
|
|
}
|
2014-11-17 11:01:21 -08:00
|
|
|
|
2016-03-08 13:36:48 -08:00
|
|
|
@Component({selector: 'app', directives: [], template: ``})
|
2015-09-24 14:51:19 -07:00
|
|
|
class CompilerAppComponent {
|
2016-04-13 17:05:17 -07:00
|
|
|
constructor(private _compiler: ComponentResolver) {}
|
2015-09-24 14:51:19 -07:00
|
|
|
compileNoBindings() {
|
2015-10-01 10:07:49 -07:00
|
|
|
this._compiler.clearCache();
|
2016-04-13 17:05:17 -07:00
|
|
|
return this._compiler.resolveComponent(BenchmarkComponentNoBindings);
|
2014-12-22 17:50:10 -08:00
|
|
|
}
|
2014-11-17 20:47:05 -08:00
|
|
|
|
2015-09-24 14:51:19 -07:00
|
|
|
compileWithBindings() {
|
2015-10-01 10:07:49 -07:00
|
|
|
this._compiler.clearCache();
|
2016-04-13 17:05:17 -07:00
|
|
|
return this._compiler.resolveComponent(BenchmarkComponentWithBindings);
|
2015-09-24 14:51:19 -07:00
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
}
|
|
|
|
|
2015-09-30 20:59:23 -07:00
|
|
|
@Directive({selector: '[dir0]', inputs: ['prop: attr0']})
|
2015-05-29 21:40:15 -07:00
|
|
|
class Dir0 {
|
2016-01-06 14:13:44 -08:00
|
|
|
prop: any;
|
2015-05-29 21:40:15 -07:00
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-09-30 20:59:23 -07:00
|
|
|
@Directive({selector: '[dir1]', inputs: ['prop: attr1']})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir1 {
|
2016-01-06 14:13:44 -08:00
|
|
|
prop: any;
|
2015-05-29 21:40:15 -07:00
|
|
|
constructor(dir0: Dir0) {}
|
2014-11-17 20:47:05 -08:00
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-09-30 20:59:23 -07:00
|
|
|
@Directive({selector: '[dir2]', inputs: ['prop: attr2']})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir2 {
|
2016-01-06 14:13:44 -08:00
|
|
|
prop: any;
|
2015-05-29 21:40:15 -07:00
|
|
|
constructor(dir1: Dir1) {}
|
2014-11-17 20:47:05 -08:00
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-09-30 20:59:23 -07:00
|
|
|
@Directive({selector: '[dir3]', inputs: ['prop: attr3']})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir3 {
|
2016-01-06 14:13:44 -08:00
|
|
|
prop: any;
|
2015-05-29 21:40:15 -07:00
|
|
|
constructor(dir2: Dir2) {}
|
2014-11-17 20:47:05 -08:00
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-09-30 20:59:23 -07:00
|
|
|
@Directive({selector: '[dir4]', inputs: ['prop: attr4']})
|
2014-11-17 20:47:05 -08:00
|
|
|
class Dir4 {
|
2016-01-06 14:13:44 -08:00
|
|
|
prop: any;
|
2015-05-29 21:40:15 -07:00
|
|
|
constructor(dir3: Dir3) {}
|
2014-11-17 20:47:05 -08:00
|
|
|
}
|
2014-11-14 14:03:03 -08:00
|
|
|
|
2015-05-12 11:03:14 -07:00
|
|
|
|
2016-03-08 13:36:48 -08:00
|
|
|
@Component({
|
|
|
|
selector: 'cmp-nobind',
|
2015-05-12 11:03:14 -07:00
|
|
|
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>`
|
|
|
|
})
|
2015-05-29 21:40:15 -07:00
|
|
|
class BenchmarkComponentNoBindings {
|
|
|
|
}
|
2015-05-12 11:03:14 -07:00
|
|
|
|
2016-03-08 13:36:48 -08:00
|
|
|
@Component({
|
|
|
|
selector: 'cmp-withbind',
|
2015-05-12 11:03:14 -07:00
|
|
|
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>`
|
|
|
|
})
|
2015-05-29 21:40:15 -07:00
|
|
|
class BenchmarkComponentWithBindings {
|
2016-01-06 14:13:44 -08:00
|
|
|
value0: any;
|
|
|
|
value1: any;
|
|
|
|
value2: any;
|
|
|
|
value3: any;
|
|
|
|
value4: any;
|
|
|
|
|
|
|
|
inter0: any;
|
|
|
|
inter1: any;
|
|
|
|
inter2: any;
|
|
|
|
inter3: any;
|
|
|
|
inter4: any;
|
2015-05-29 21:40:15 -07:00
|
|
|
}
|