| 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 |