Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 494deda

Browse files
committed
perf(View): Improve View instantiation speed and memory consumption.
View contains many injectors which are expensive in both speed and memory. The New DirectiveInjector assumes that there are no more than 10 directives per element and can be a lot more efficient than a array/hash lookup and those it can be faster as well as smaller. This change makes View instantiation speed 4x faster in Dartium VM. BREAKING CHANGE: - Injector no longer supports visibility - The Directive:module instead of returning Module now takes DirectiveModule (which supports visibility) - Application Injector and DirectiveInjector now have separate trees. (The root if DirectiveInjector is ApplicationInjector)
1 parent 5ef596d commit 494deda

File tree

79 files changed

+1216
-554
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+1216
-554
lines changed

benchmark/pubspec.lock

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ packages:
44
analyzer:
55
description: analyzer
66
source: hosted
7-
version: "0.13.6"
7+
version: "0.15.7"
88
angular:
99
description:
1010
path: ".."
@@ -30,23 +30,25 @@ packages:
3030
code_transformers:
3131
description: code_transformers
3232
source: hosted
33-
version: "0.1.3"
33+
version: "0.1.4+2"
3434
collection:
3535
description: collection
3636
source: hosted
3737
version: "0.9.2"
3838
di:
39-
description: di
40-
source: hosted
41-
version: "1.0.0"
39+
description:
40+
path: "../../di.dart"
41+
relative: true
42+
source: path
43+
version: "2.0.0-alpha.9"
4244
html5lib:
4345
description: html5lib
4446
source: hosted
4547
version: "0.10.0"
4648
intl:
4749
description: intl
4850
source: hosted
49-
version: "0.9.9"
51+
version: "0.9.10"
5052
logging:
5153
description: logging
5254
source: hosted

benchmark/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ transformers:
1313
- $dart2js:
1414
minify: false
1515
checked: false
16+
commandLineOptions: [--dump-info]

benchmark/web/tree.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ class NgFreeTreeClass implements ShadowRootAware {
246246

247247
// Main function runs the benchmark.
248248
main() {
249+
setupModuleTypeReflector();
249250
var cleanup, createDom;
250251

251252
var module = new Module()

bin/parser_generator_for_spec.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'dart:io' as io;
22

33
import 'package:di/di.dart';
4-
import 'package:di/dynamic_injector.dart';
54
import 'package:angular/cache/module.dart';
65
import 'package:angular/core/parser/lexer.dart';
76
import 'package:angular/core/parser/parser.dart';
@@ -14,8 +13,7 @@ main(arguments) {
1413
..bind(Parser, toImplementation: DynamicParser)
1514
..install(new CacheModule());
1615
module.bind(ParserBackend, toImplementation: DartGetterSetterGen);
17-
Injector injector = new DynamicInjector(modules: [module],
18-
allowImplicitInjection: true);
16+
Injector injector = new ModuleInjector([module]);
1917

2018
// List generated using:
2119
// node node_modules/karma/bin/karma run | grep -Eo ":XNAY:.*:XNAY:" | sed -e 's/:XNAY://g' | sed -e "s/^/'/" | sed -e "s/$/',/" | sort | uniq > missing_expressions

lib/angular.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ export 'package:angular/introspection.dart' hide
99
elementExpando, publishToJavaScript;
1010
export 'package:angular/formatter/module.dart';
1111
export 'package:angular/routing/module.dart';
12-
export 'package:di/di.dart' hide lastKeyId;
12+
export 'package:di/di.dart';
13+
export 'package:di/annotations.dart';
1314
export 'package:route_hierarchical/client.dart' hide childRoute;
14-

lib/animate/module.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ import 'package:angular/core_dom/dom_util.dart' as util;
108108
import 'package:logging/logging.dart';
109109
import 'package:perf_api/perf_api.dart';
110110
import 'package:di/di.dart';
111+
import 'package:di/annotations.dart';
111112

112113
@MirrorsUsed(targets: const [
113114
'angular.animate'

lib/application.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import 'package:angular/routing/module.dart';
8484
import 'package:angular/introspection.dart';
8585

8686
import 'package:angular/core_dom/static_keys.dart';
87+
import 'package:angular/core_dom/directive_injector.dart';
8788

8889
/**
8990
* This is the top level module which describes all Angular components,
@@ -96,6 +97,7 @@ import 'package:angular/core_dom/static_keys.dart';
9697
*/
9798
class AngularModule extends Module {
9899
AngularModule() {
100+
DirectiveInjector.initUID();
99101
install(new CacheModule());
100102
install(new CoreModule());
101103
install(new CoreDomModule());
@@ -105,7 +107,6 @@ class AngularModule extends Module {
105107
install(new PerfModule());
106108
install(new RoutingModule());
107109

108-
bind(MetadataExtractor);
109110
bind(Expando, toValue: elementExpando);
110111
}
111112
}
@@ -175,9 +176,11 @@ abstract class Application {
175176
injector.getByKey(JS_CACHE_REGISTER_KEY);
176177
initializeDateFormatting(null, null).then((_) {
177178
try {
178-
var compiler = injector.getByKey(COMPILER_KEY);
179-
var viewFactory = compiler(rootElements, injector.getByKey(DIRECTIVE_MAP_KEY));
180-
viewFactory(injector, rootElements);
179+
Compiler compiler = injector.getByKey(COMPILER_KEY);
180+
DirectiveMap directiveMap = injector.getByKey(DIRECTIVE_MAP_KEY);
181+
RootScope rootScope = injector.getByKey(ROOT_SCOPE_KEY);
182+
ViewFactory viewFactory = compiler(rootElements, directiveMap);
183+
viewFactory(rootScope, injector.get(DirectiveInjector), rootElements);
181184
} catch (e, s) {
182185
exceptionHandler(e, s);
183186
}
@@ -190,5 +193,5 @@ abstract class Application {
190193
* Creates an injector function that can be used for retrieving services as well as for
191194
* dependency injection.
192195
*/
193-
Injector createInjector();
196+
Injector createInjector() => new ModuleInjector(modules);
194197
}

lib/application_factory.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
*/
1010
library angular.app.factory;
1111

12-
import 'package:di/dynamic_injector.dart';
1312
import 'package:angular/angular.dart';
1413
import 'package:angular/core/registry.dart';
1514
import 'package:angular/core/parser/parser.dart' show ClosureMap;
@@ -64,8 +63,6 @@ class _DynamicApplication extends Application {
6463
..bind(FieldGetterFactory, toImplementation: DynamicFieldGetterFactory)
6564
..bind(ClosureMap, toImplementation: DynamicClosureMap);
6665
}
67-
68-
Injector createInjector() => new DynamicInjector(modules: modules);
6966
}
7067

7168
/**

lib/application_factory_static.dart

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030
*/
3131
library angular.app.factory.static;
3232

33-
import 'package:di/static_injector.dart';
34-
import 'package:di/di.dart' show TypeFactory, Injector;
3533
import 'package:angular/application.dart';
3634
import 'package:angular/core/registry.dart';
3735
import 'package:angular/core/parser/parser.dart';
@@ -46,9 +44,7 @@ export 'package:angular/change_detection/change_detection.dart' show
4644
FieldSetter;
4745

4846
class _StaticApplication extends Application {
49-
final Map<Type, TypeFactory> typeFactories;
50-
51-
_StaticApplication(Map<Type, TypeFactory> this.typeFactories,
47+
_StaticApplication(
5248
Map<Type, Object> metadata,
5349
Map<String, FieldGetter> fieldGetters,
5450
Map<String, FieldSetter> fieldSetters,
@@ -58,9 +54,6 @@ class _StaticApplication extends Application {
5854
..bind(FieldGetterFactory, toValue: new StaticFieldGetterFactory(fieldGetters))
5955
..bind(ClosureMap, toValue: new StaticClosureMap(fieldGetters, fieldSetters, symbols));
6056
}
61-
62-
Injector createInjector() =>
63-
new StaticInjector(modules: modules, typeFactories: typeFactories);
6457
}
6558

6659
/**
@@ -81,20 +74,19 @@ class _StaticApplication extends Application {
8174
* becomes:
8275
*
8376
* main() {
84-
* staticApplication(generated_static_injector.factories,
85-
* generated_static_metadata.typeAnnotations,
86-
* generated_static_expressions.getters,
87-
* generated_static_expressions.setters,
88-
* generated_static_expressions.symbols)
89-
* .addModule(new Module()..bind(HelloWorldController))
90-
* .run();
77+
* staticApplication(
78+
* generated_static_metadata.typeAnnotations,
79+
* generated_static_expressions.getters,
80+
* generated_static_expressions.setters,
81+
* generated_static_expressions.symbols)
82+
* .addModule(new Module()..bind(HelloWorldController))
83+
* .run();
9184
*
9285
*/
9386
Application staticApplicationFactory(
94-
Map<Type, TypeFactory> typeFactories,
9587
Map<Type, Object> metadata,
9688
Map<String, FieldGetter> fieldGetters,
9789
Map<String, FieldSetter> fieldSetters,
9890
Map<String, Symbol> symbols) {
99-
return new _StaticApplication(typeFactories, metadata, fieldGetters, fieldSetters, symbols);
91+
return new _StaticApplication(metadata, fieldGetters, fieldSetters, symbols);
10092
}

lib/cache/js_cache_register.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ library angular.cache.js;
44

55
import 'dart:js' as js;
66
import 'package:di/di.dart';
7+
import 'package:di/annotations.dart';
78
import 'package:angular/core/annotation_src.dart';
89
import 'package:angular/cache/module.dart';
910

lib/cache/module.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import 'dart:collection';
44
import 'dart:async';
55

66
import 'package:di/di.dart';
7-
import 'package:angular/core/annotation_src.dart';
7+
import 'package:di/annotations.dart';
88

99
part "cache.dart";
1010
part "cache_register.dart";
@@ -13,4 +13,7 @@ class CacheModule extends Module {
1313
CacheModule() {
1414
bind(CacheRegister);
1515
}
16+
CacheModule.withReflector(reflector): super.withReflector(reflector) {
17+
bind(CacheRegister);
18+
}
1619
}

lib/change_detection/ast_parser.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ library angular.change_detection.ast_parser;
22

33
import 'dart:collection';
44

5+
import 'package:di/annotations.dart';
56
import 'package:angular/core/parser/syntax.dart' as syntax;
67
import 'package:angular/core/parser/parser.dart';
78
import 'package:angular/core/formatter.dart';

lib/core/annotation.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ export "package:angular/core/annotation_src.dart" show
1313
Formatter,
1414
DirectiveBinder,
1515
DirectiveBinderFn,
16-
Injectable,
1716

1817
Directive,
1918
Component,
2019
Controller,
2120
Decorator,
21+
Visibility,
2222

2323
DirectiveAnnotation,
2424
NgAttr,

0 commit comments

Comments
 (0)