benchpress
Version:
Benchpress - a framework for e2e performance tests
51 lines • 8.45 kB
JavaScript
import { ListWrapper } from 'angular2/src/facade/collection';
import { bind, provide, OpaqueToken } from 'angular2/src/core/di';
import { Validator } from '../validator';
import { Statistic } from '../statistic';
/**
* A validator that checks the regression slope of a specific metric.
* Waits for the regression slope to be >=0.
*/
export class RegressionSlopeValidator extends Validator {
constructor(sampleSize, metric) {
super();
this._sampleSize = sampleSize;
this._metric = metric;
}
// TODO(tbosch): use static values when our transpiler supports them
static get SAMPLE_SIZE() { return _SAMPLE_SIZE; }
// TODO(tbosch): use static values when our transpiler supports them
static get METRIC() { return _METRIC; }
// TODO(tbosch): use static values when our transpiler supports them
static get BINDINGS() { return _PROVIDERS; }
describe() {
return { 'sampleSize': this._sampleSize, 'regressionSlopeMetric': this._metric };
}
validate(completeSample) {
if (completeSample.length >= this._sampleSize) {
var latestSample = ListWrapper.slice(completeSample, completeSample.length - this._sampleSize, completeSample.length);
var xValues = [];
var yValues = [];
for (var i = 0; i < latestSample.length; i++) {
// For now, we only use the array index as x value.
// TODO(tbosch): think about whether we should use time here instead
xValues.push(i);
yValues.push(latestSample[i].values[this._metric]);
}
var regressionSlope = Statistic.calculateRegressionSlope(xValues, Statistic.calculateMean(xValues), yValues, Statistic.calculateMean(yValues));
return regressionSlope >= 0 ? latestSample : null;
}
else {
return null;
}
}
}
var _SAMPLE_SIZE = new OpaqueToken('RegressionSlopeValidator.sampleSize');
var _METRIC = new OpaqueToken('RegressionSlopeValidator.metric');
var _PROVIDERS = [
bind(RegressionSlopeValidator)
.toFactory((sampleSize, metric) => new RegressionSlopeValidator(sampleSize, metric), [_SAMPLE_SIZE, _METRIC]),
provide(_SAMPLE_SIZE, { useValue: 10 }),
provide(_METRIC, { useValue: 'scriptTime' })
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVncmVzc2lvbl9zbG9wZV92YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkaWZmaW5nX3BsdWdpbl93cmFwcGVyLW91dHB1dF9wYXRoLXhCTElCclZSLnRtcC9iZW5jaHByZXNzL3NyYy92YWxpZGF0b3IvcmVncmVzc2lvbl9zbG9wZV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ik9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQ0FBZ0M7T0FDbkQsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFZLFdBQVcsRUFBQyxNQUFNLHNCQUFzQjtPQUVsRSxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWM7T0FDL0IsRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjO0FBR3RDOzs7R0FHRztBQUNILDhDQUE4QyxTQUFTO0lBV3JELFlBQVksVUFBVSxFQUFFLE1BQU07UUFDNUIsT0FBTyxDQUFDO1FBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDeEIsQ0FBQztJQWRELG9FQUFvRTtJQUNwRSxXQUFXLFdBQVcsS0FBa0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDOUQsb0VBQW9FO0lBQ3BFLFdBQVcsTUFBTSxLQUFrQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRCxvRUFBb0U7SUFDcEUsV0FBVyxRQUFRLEtBQWlCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBV3hELFFBQVE7UUFDTixNQUFNLENBQUMsRUFBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELFFBQVEsQ0FBQyxjQUErQjtRQUN0QyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzlDLElBQUksWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFDeEQsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDakIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzdDLG1EQUFtRDtnQkFDbkQsb0VBQW9FO2dCQUNwRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELElBQUksZUFBZSxHQUFHLFNBQVMsQ0FBQyx3QkFBd0IsQ0FDcEQsT0FBTyxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMxRixNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BELENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxJQUFJLFlBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0FBQzFFLElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFDakUsSUFBSSxVQUFVLEdBQUc7SUFDZixJQUFJLENBQUMsd0JBQXdCLENBQUM7U0FDekIsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sS0FBSyxJQUFJLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFDeEUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUMsUUFBUSxFQUFFLFlBQVksRUFBQyxDQUFDO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtiaW5kLCBwcm92aWRlLCBQcm92aWRlciwgT3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuaW1wb3J0IHtWYWxpZGF0b3J9IGZyb20gJy4uL3ZhbGlkYXRvcic7XG5pbXBvcnQge1N0YXRpc3RpY30gZnJvbSAnLi4vc3RhdGlzdGljJztcbmltcG9ydCB7TWVhc3VyZVZhbHVlc30gZnJvbSAnLi4vbWVhc3VyZV92YWx1ZXMnO1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIHRoYXQgY2hlY2tzIHRoZSByZWdyZXNzaW9uIHNsb3BlIG9mIGEgc3BlY2lmaWMgbWV0cmljLlxuICogV2FpdHMgZm9yIHRoZSByZWdyZXNzaW9uIHNsb3BlIHRvIGJlID49MC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ3Jlc3Npb25TbG9wZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7XG4gIC8vIFRPRE8odGJvc2NoKTogdXNlIHN0YXRpYyB2YWx1ZXMgd2hlbiBvdXIgdHJhbnNwaWxlciBzdXBwb3J0cyB0aGVtXG4gIHN0YXRpYyBnZXQgU0FNUExFX1NJWkUoKTogT3BhcXVlVG9rZW4geyByZXR1cm4gX1NBTVBMRV9TSVpFOyB9XG4gIC8vIFRPRE8odGJvc2NoKTogdXNlIHN0YXRpYyB2YWx1ZXMgd2hlbiBvdXIgdHJhbnNwaWxlciBzdXBwb3J0cyB0aGVtXG4gIHN0YXRpYyBnZXQgTUVUUklDKCk6IE9wYXF1ZVRva2VuIHsgcmV0dXJuIF9NRVRSSUM7IH1cbiAgLy8gVE9ETyh0Ym9zY2gpOiB1c2Ugc3RhdGljIHZhbHVlcyB3aGVuIG91ciB0cmFuc3BpbGVyIHN1cHBvcnRzIHRoZW1cbiAgc3RhdGljIGdldCBCSU5ESU5HUygpOiBQcm92aWRlcltdIHsgcmV0dXJuIF9QUk9WSURFUlM7IH1cblxuICBfc2FtcGxlU2l6ZTogbnVtYmVyO1xuICBfbWV0cmljOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2FtcGxlU2l6ZSwgbWV0cmljKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICB0aGlzLl9tZXRyaWMgPSBtZXRyaWM7XG4gIH1cblxuICBkZXNjcmliZSgpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgcmV0dXJuIHsnc2FtcGxlU2l6ZSc6IHRoaXMuX3NhbXBsZVNpemUsICdyZWdyZXNzaW9uU2xvcGVNZXRyaWMnOiB0aGlzLl9tZXRyaWN9O1xuICB9XG5cbiAgdmFsaWRhdGUoY29tcGxldGVTYW1wbGU6IE1lYXN1cmVWYWx1ZXNbXSk6IE1lYXN1cmVWYWx1ZXNbXSB7XG4gICAgaWYgKGNvbXBsZXRlU2FtcGxlLmxlbmd0aCA+PSB0aGlzLl9zYW1wbGVTaXplKSB7XG4gICAgICB2YXIgbGF0ZXN0U2FtcGxlID0gTGlzdFdyYXBwZXIuc2xpY2UoY29tcGxldGVTYW1wbGUsIGNvbXBsZXRlU2FtcGxlLmxlbmd0aCAtIHRoaXMuX3NhbXBsZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVTYW1wbGUubGVuZ3RoKTtcbiAgICAgIHZhciB4VmFsdWVzID0gW107XG4gICAgICB2YXIgeVZhbHVlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXRlc3RTYW1wbGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gRm9yIG5vdywgd2Ugb25seSB1c2UgdGhlIGFycmF5IGluZGV4IGFzIHggdmFsdWUuXG4gICAgICAgIC8vIFRPRE8odGJvc2NoKTogdGhpbmsgYWJvdXQgd2hldGhlciB3ZSBzaG91bGQgdXNlIHRpbWUgaGVyZSBpbnN0ZWFkXG4gICAgICAgIHhWYWx1ZXMucHVzaChpKTtcbiAgICAgICAgeVZhbHVlcy5wdXNoKGxhdGVzdFNhbXBsZVtpXS52YWx1ZXNbdGhpcy5fbWV0cmljXSk7XG4gICAgICB9XG4gICAgICB2YXIgcmVncmVzc2lvblNsb3BlID0gU3RhdGlzdGljLmNhbGN1bGF0ZVJlZ3Jlc3Npb25TbG9wZShcbiAgICAgICAgICB4VmFsdWVzLCBTdGF0aXN0aWMuY2FsY3VsYXRlTWVhbih4VmFsdWVzKSwgeVZhbHVlcywgU3RhdGlzdGljLmNhbGN1bGF0ZU1lYW4oeVZhbHVlcykpO1xuICAgICAgcmV0dXJuIHJlZ3Jlc3Npb25TbG9wZSA+PSAwID8gbGF0ZXN0U2FtcGxlIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbnZhciBfU0FNUExFX1NJWkUgPSBuZXcgT3BhcXVlVG9rZW4oJ1JlZ3Jlc3Npb25TbG9wZVZhbGlkYXRvci5zYW1wbGVTaXplJyk7XG52YXIgX01FVFJJQyA9IG5ldyBPcGFxdWVUb2tlbignUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yLm1ldHJpYycpO1xudmFyIF9QUk9WSURFUlMgPSBbXG4gIGJpbmQoUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yKVxuICAgICAgLnRvRmFjdG9yeSgoc2FtcGxlU2l6ZSwgbWV0cmljKSA9PiBuZXcgUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yKHNhbXBsZVNpemUsIG1ldHJpYyksXG4gICAgICAgICAgICAgICAgIFtfU0FNUExFX1NJWkUsIF9NRVRSSUNdKSxcbiAgcHJvdmlkZShfU0FNUExFX1NJWkUsIHt1c2VWYWx1ZTogMTB9KSxcbiAgcHJvdmlkZShfTUVUUklDLCB7dXNlVmFsdWU6ICdzY3JpcHRUaW1lJ30pXG5dO1xuIl19