angular-docs-cn/modules/benchmarks/src/change_detection/change_detection_benchmark.js
Tobias Bosch 8db77f2405 refactor(build): simplify and modularize
simplify:
- use same html file for dart and JS
- build benchmarks automatically when doing `gulp build`
- centralize configuration

modularize:
- move all build tasks into separate node.js modules under
  `tools/build`.

changes:
- the `build` folder is now the `dist` folder

Closes #284
2014-12-05 16:30:36 -08:00

186 lines
4.5 KiB
JavaScript

import {ListWrapper, MapWrapper} from 'facade/collection';
import {Parser} from 'change_detection/parser/parser';
import {Lexer} from 'change_detection/parser/lexer';
import {reflector} from 'reflection/reflection';
import {isPresent} from 'facade/lang';
import {benchmark, benchmarkStep} from 'benchpress/benchpress';
import {
ChangeDetector,
ProtoRecordRange,
WatchGroupDispatcher,
} from 'change_detection/change_detector';
var ITERATIONS = 200000;
class Obj {
field0;
field1;
field2;
field3;
field4;
field5;
field6;
field7;
field8;
field9;
setField(index, value) {
switch (index) {
case 0: this.field0 = value; break;
case 1: this.field1 = value; break;
case 2: this.field2 = value; break;
case 3: this.field3 = value; break;
case 4: this.field4 = value; break;
case 5: this.field5 = value; break;
case 6: this.field6 = value; break;
case 7: this.field7 = value; break;
case 8: this.field8 = value; break;
case 9: this.field9 = value; break;
}
}
}
class Row {
previousValue;
obj;
getter;
next;
}
function setUpReflector() {
reflector.registerGetters({
'field0': function(obj){return obj.field0},
'field1': function(obj){return obj.field1},
'field2': function(obj){return obj.field2},
'field3': function(obj){return obj.field3},
'field4': function(obj){return obj.field4},
'field5': function(obj){return obj.field5},
'field6': function(obj){return obj.field6},
'field7': function(obj){return obj.field7},
'field8': function(obj){return obj.field8},
'field9': function(obj){return obj.field9}
});
reflector.registerSetters({
'field0': function(obj, v){return obj.field0 = v},
'field1': function(obj, v){return obj.field1 = v},
'field2': function(obj, v){return obj.field2 = v},
'field3': function(obj, v){return obj.field3 = v},
'field4': function(obj, v){return obj.field4 = v},
'field5': function(obj, v){return obj.field5 = v},
'field6': function(obj, v){return obj.field6 = v},
'field7': function(obj, v){return obj.field7 = v},
'field8': function(obj, v){return obj.field8 = v},
'field9': function(obj, v){return obj.field9 = v}
});
}
function setUpBaseline() {
function createRow(i) {
var obj = new Obj();
var index = i % 10;
obj.setField(index, i);
var r = new Row();
r.obj = obj;
r.previousValue = i;
r.getter = reflector.getter(`field${index}`);
return r;
}
var head = createRow(0);
var current = head;
for (var i = 1; i < ITERATIONS; i++) {
var newRow = createRow(i);
current.next = newRow;
current = newRow;
}
return head;
}
function setUpChangeDetection() {
var dispatcher = new DummyDispatcher();
var parser = new Parser(new Lexer());
var parentProto = new ProtoRecordRange();
var parentRange = parentProto.instantiate(dispatcher, MapWrapper.create());
var astWithSource = [
parser.parseBinding('field0'),
parser.parseBinding('field1'),
parser.parseBinding('field2'),
parser.parseBinding('field3'),
parser.parseBinding('field4'),
parser.parseBinding('field5'),
parser.parseBinding('field6'),
parser.parseBinding('field7'),
parser.parseBinding('field8'),
parser.parseBinding('field9')
];
function proto(i) {
var prr = new ProtoRecordRange();
prr.addRecordsFromAST(astWithSource[i % 10].ast, "memo", i, false);
return prr;
}
var prr = [
proto(0),
proto(1),
proto(2),
proto(3),
proto(4),
proto(5),
proto(6),
proto(7),
proto(8),
proto(9)
];
for (var i = 0; i < ITERATIONS; ++i) {
var obj = new Obj();
var index = i % 10;
obj.setField(index, i);
var rr = prr[index].instantiate(dispatcher, null);
rr.setContext(obj);
parentRange.addRange(rr);
}
return new ChangeDetector(parentRange);
}
export function main () {
setUpReflector();
benchmark(`Baseline`, function () {
var head = setUpBaseline();
benchmarkStep('run', function () {
var current = head;
while (isPresent(current)) {
if (current.getter(current.obj) !== current.previousValue) {
throw "should not happen";
}
current = current.next;
}
});
});
benchmark(`Change Detection`, function() {
var cd = setUpChangeDetection();
benchmarkStep('run', function() {
cd.detectChanges();
});
});
}
class DummyDispatcher extends WatchGroupDispatcher {
onRecordChange(record, context) {
}
}