OLD | NEW |
| (Empty) |
1 library parser_perf; | |
2 | |
3 import '_perf.dart'; | |
4 import 'package:angular/core/module.dart'; | |
5 import 'package:angular/core/parser/parser.dart'; | |
6 import 'package:angular/filter/module.dart'; | |
7 import 'package:di/di.dart'; | |
8 import 'package:di/dynamic_injector.dart'; | |
9 import 'package:intl/intl.dart'; | |
10 | |
11 import '../gen/generated_functions.dart' as generated_functions; | |
12 import '../gen/generated_getter_setter.dart' as generated_getter_setter; | |
13 | |
14 main() { | |
15 var module = new Module() | |
16 ..type(Parser, implementedBy: DynamicParser) | |
17 ..type(ParserBackend, implementedBy: DynamicParserBackend) | |
18 ..type(SubstringFilter) | |
19 ..type(IncrementFilter) | |
20 ..install(new NgFilterModule()); | |
21 var injector = new DynamicInjector( | |
22 modules: [module], | |
23 allowImplicitInjection:true); | |
24 var scope = injector.get(Scope); | |
25 var reflectiveParser = injector.get(Parser); | |
26 var filterMap = injector.get(FilterMap); | |
27 | |
28 var generatedParser = new DynamicInjector( | |
29 modules: [new Module() | |
30 ..type(Parser, implementedBy: StaticParser) | |
31 ..type(ParserBackend, implementedBy: DynamicParserBackend) | |
32 ..value(StaticParserFunctions, generated_functions.functions())], | |
33 allowImplicitInjection:true).get(Parser); | |
34 | |
35 var hybridParser = new DynamicInjector( | |
36 modules: [new Module() | |
37 ..type(Parser, implementedBy: DynamicParser) | |
38 ..type(ParserBackend, implementedBy: DynamicParserBackend) | |
39 ..type(ClosureMap, implementedBy: generated_getter_setter.StaticClosureM
ap)], | |
40 allowImplicitInjection:true).get(Parser); | |
41 | |
42 scope['a'] = new ATest(); | |
43 scope['e1'] = new EqualsThrows(); | |
44 scope['o'] = new OTest(); | |
45 | |
46 compare(expr, idealFn) { | |
47 var nf = new NumberFormat.decimalPattern(); | |
48 Expression reflectionExpr = reflectiveParser(expr); | |
49 Expression generatedExpr = generatedParser(expr); | |
50 Expression hybridExpr = hybridParser(expr); | |
51 var measure = (b) => statMeasure(b).mean_ops_sec; | |
52 var gTime = measure(() => generatedExpr.eval(scope)); | |
53 var rTime = measure(() => reflectionExpr.eval(scope)); | |
54 var hTime = measure(() => hybridExpr.eval(scope)); | |
55 var iTime = measure(() => idealFn(scope)); | |
56 print('$expr => g: ${nf.format(gTime)} ops/sec ' + | |
57 'r: ${nf.format(rTime)} ops/sec ' + | |
58 'h: ${nf.format(hTime)} ops/sec ' + | |
59 'i: ${nf.format(iTime)} ops/sec = ' + | |
60 'i/g: ${nf.format(iTime / gTime)} x ' + | |
61 'i/r: ${nf.format(iTime / rTime)} x ' + | |
62 'i/h: ${nf.format(iTime / hTime)} x ' + | |
63 'g/h: ${nf.format(gTime / hTime)} x ' + | |
64 'h/r: ${nf.format(hTime / rTime)} x ' + | |
65 'g/r: ${nf.format(gTime / rTime)} x'); | |
66 } | |
67 | |
68 compare('a.b.c', (scope) => scope['a'].b.c); | |
69 compare('e1.b', (scope) => scope['e1'].b); | |
70 compare('o.f()', (scope) => scope['o'].f()); | |
71 compare('null', (scope) => null); | |
72 compare('x.b.c', (s, [l]) { | |
73 if (l != null && l.containsKey('x')) s = l['x']; | |
74 else if (s != null ) s = s is Map ? s['x'] : s.x; | |
75 if (s != null ) s = s is Map ? s['b'] : s.b; | |
76 if (s != null ) s = s is Map ? s['c'] : s.c; | |
77 return s; | |
78 }); | |
79 compare('doesNotExist', (scope) => scope['doesNotExists']); | |
80 } | |
81 | |
82 | |
83 class ATest { | |
84 var b = new BTest(); | |
85 } | |
86 | |
87 class BTest { | |
88 var c = 6; | |
89 } | |
90 | |
91 class OTest { | |
92 f() => 42; | |
93 } | |
94 | |
95 class EqualsThrows { | |
96 var b = 3; | |
97 operator ==(x) { | |
98 try { | |
99 throw "no"; | |
100 } catch (e) { | |
101 return false; | |
102 } | |
103 } | |
104 } | |
105 | |
106 @NgFilter(name:'increment') | |
107 class IncrementFilter { | |
108 call(a, b) => a + b; | |
109 } | |
110 | |
111 @NgFilter(name:'substring') | |
112 class SubstringFilter { | |
113 call(String str, startIndex, [endIndex]) { | |
114 return str.substring(startIndex, endIndex); | |
115 } | |
116 } | |
117 | |
OLD | NEW |