refactor(perf): use webdriver to execute benchmarks
- use performance log of chromedriver / appium to get timeline data for calculating metrics for benchmarks - change all benchmarks to be made of a standalone application and a protractor test that collectes timeline data - fix and simplify benchmarks - add dart2js to build - remove benchpress Closes #330
This commit is contained in:
12
modules/benchmarks/src/di/di_benchmark.html
Normal file
12
modules/benchmarks/src/di/di_benchmark.html
Normal file
@ -0,0 +1,12 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<button id="getByToken">Injector.get (token)</button>
|
||||
<button id="getByKey">Injector.get (key)</button>
|
||||
<button id="getChild">Injector.get (grand x 5 child)</button>
|
||||
<button id="instantiate">Injector.instantiate</button>
|
||||
|
||||
$SCRIPTS$
|
||||
</body>
|
||||
</html>
|
113
modules/benchmarks/src/di/di_benchmark.js
Normal file
113
modules/benchmarks/src/di/di_benchmark.js
Normal file
@ -0,0 +1,113 @@
|
||||
import {Injector, Key} from "di/di";
|
||||
import {reflector} from 'reflection/reflection';
|
||||
import {document, DOM} from 'facade/dom';
|
||||
|
||||
var count = 0;
|
||||
|
||||
function setupReflector() {
|
||||
reflector.registerType(A, {
|
||||
'factory': () => new A(),
|
||||
'parameters': [],
|
||||
'annotations' : []
|
||||
});
|
||||
reflector.registerType(B, {
|
||||
'factory': (a) => new B(a),
|
||||
'parameters': [[A]],
|
||||
'annotations' : []
|
||||
});
|
||||
reflector.registerType(C, {
|
||||
'factory': (b) => new C(b),
|
||||
'parameters': [[B]],
|
||||
'annotations' : []
|
||||
});
|
||||
reflector.registerType(D, {
|
||||
'factory': (c,b) => new D(c,b),
|
||||
'parameters': [[C],[B]],
|
||||
'annotations' : []
|
||||
});
|
||||
reflector.registerType(E, {
|
||||
'factory': (d,c) => new E(d,c),
|
||||
'parameters': [[D],[C]],
|
||||
'annotations' : []
|
||||
});
|
||||
}
|
||||
|
||||
export function main() {
|
||||
setupReflector();
|
||||
var bindings = [A, B, C, D, E];
|
||||
var injector = new Injector(bindings);
|
||||
|
||||
var D_KEY = Key.get(D);
|
||||
var E_KEY = Key.get(E);
|
||||
var childInjector = injector.
|
||||
createChild([]).
|
||||
createChild([]).
|
||||
createChild([]).
|
||||
createChild([]).
|
||||
createChild([]);
|
||||
|
||||
function getByToken (_) {
|
||||
for (var i = 0; i < 20000; ++i) {
|
||||
injector.get(D);
|
||||
injector.get(E);
|
||||
}
|
||||
}
|
||||
function getByKey(_) {
|
||||
for (var i = 0; i < 20000; ++i) {
|
||||
injector.get(D_KEY);
|
||||
injector.get(E_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
function getChild (_) {
|
||||
for (var i = 0; i < 20000; ++i) {
|
||||
childInjector.get(D);
|
||||
childInjector.get(E);
|
||||
}
|
||||
}
|
||||
|
||||
function instantiate (_) {
|
||||
for (var i = 0; i < 5000; ++i) {
|
||||
var child = injector.createChild([E]);
|
||||
child.get(E);
|
||||
}
|
||||
}
|
||||
|
||||
DOM.on(DOM.querySelector(document, '#getByToken'), 'click', getByToken);
|
||||
DOM.on(DOM.querySelector(document, '#getByKey'), 'click', getByKey);
|
||||
DOM.on(DOM.querySelector(document, '#getChild'), 'click', getChild);
|
||||
DOM.on(DOM.querySelector(document, '#instantiate'), 'click', instantiate);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
class A {
|
||||
constructor() {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
constructor(a:A) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class C {
|
||||
constructor(b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class D {
|
||||
constructor(c:C, b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class E {
|
||||
constructor(d:D, c:C) {
|
||||
count++;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
import {Injector} from "di/di";
|
||||
|
||||
var count = 0;
|
||||
|
||||
export function run () {
|
||||
var bindings = [A, B, C, D, E];
|
||||
var injector = new Injector(bindings);
|
||||
|
||||
for (var i = 0; i < 20000; ++i) {
|
||||
injector.get(D);
|
||||
injector.get(E);
|
||||
}
|
||||
}
|
||||
|
||||
class A {
|
||||
constructor() {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
constructor(a:A) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class C {
|
||||
constructor(b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class D {
|
||||
constructor(c:C, b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class E {
|
||||
constructor(d:D, c:C) {
|
||||
count++;
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
import {Injector, Key} from "di/di";
|
||||
|
||||
var count = 0;
|
||||
|
||||
export function run () {
|
||||
var bindings = [A, B, C, D, E];
|
||||
var injector = new Injector(bindings);
|
||||
|
||||
var D_KEY = Key.get(D);
|
||||
var E_KEY = Key.get(E);
|
||||
|
||||
for (var i = 0; i < 20000; ++i) {
|
||||
injector.get(D_KEY);
|
||||
injector.get(E_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
class A {
|
||||
constructor() {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
constructor(a:A) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class C {
|
||||
constructor(b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class D {
|
||||
constructor(c:C, b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class E {
|
||||
constructor(d:D, c:C) {
|
||||
count++;
|
||||
}
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
import {Injector, Key} from "di/di";
|
||||
|
||||
var count = 0;
|
||||
|
||||
export function run () {
|
||||
var bindings = [A, B, C, D, E];
|
||||
var injector = new Injector(bindings);
|
||||
var childInjector = injector.
|
||||
createChild([]).
|
||||
createChild([]).
|
||||
createChild([]).
|
||||
createChild([]).
|
||||
createChild([]);
|
||||
|
||||
for (var i = 0; i < 20000; ++i) {
|
||||
childInjector.get(D);
|
||||
childInjector.get(E);
|
||||
}
|
||||
}
|
||||
|
||||
class A {
|
||||
constructor() {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
constructor(a:A) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class C {
|
||||
constructor(b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class D {
|
||||
constructor(c:C, b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class E {
|
||||
constructor(d:D, c:C) {
|
||||
count++;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
import {Injector, Key} from "di/di";
|
||||
|
||||
var count = 0;
|
||||
|
||||
export function run () {
|
||||
var bindings = [A, B, C, D];
|
||||
var injector = new Injector(bindings);
|
||||
|
||||
for (var i = 0; i < 1000; ++i) {
|
||||
var child = injector.createChild([E]);
|
||||
child.get(E);
|
||||
}
|
||||
}
|
||||
|
||||
class A {
|
||||
constructor() {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
constructor(a:A) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class C {
|
||||
constructor(b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class D {
|
||||
constructor(c:C, b:B) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
class E {
|
||||
constructor(d:D, c:C) {
|
||||
count++;
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
$SCRIPTS$
|
@ -1,24 +0,0 @@
|
||||
import * as injector_get_benchmark from './injector_get_benchmark';
|
||||
import * as injector_get_by_key_benchmark from './injector_get_by_key_benchmark';
|
||||
import * as injector_get_child_benchmark from './injector_get_child_benchmark';
|
||||
import * as injector_instantiate_benchmark from './injector_instantiate_benchmark';
|
||||
|
||||
import {benchmark, benchmarkStep} from 'benchpress/benchpress';
|
||||
|
||||
export function main() {
|
||||
benchmark(`Injector.get (token)`, function() {
|
||||
benchmarkStep('run', injector_get_benchmark.run);
|
||||
});
|
||||
|
||||
benchmark(`Injector.get (key)`, function() {
|
||||
benchmarkStep('run', injector_get_by_key_benchmark.run);
|
||||
});
|
||||
|
||||
benchmark(`Injector.get (grand x 5 child)`, function() {
|
||||
benchmarkStep('run', injector_get_child_benchmark.run);
|
||||
});
|
||||
|
||||
benchmark(`Injector.instantiate`, function() {
|
||||
benchmarkStep('run', injector_instantiate_benchmark.run);
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user