UNPKG

@angular/benchpress

Version:

Benchpress - a framework for e2e performance tests

62 lines 8.35 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ var RegressionSlopeValidator_1; import { __decorate, __metadata, __param } from "tslib"; import { Inject, Injectable, InjectionToken } from '@angular/core'; import { Statistic } from '../statistic'; import { Validator } from '../validator'; /** * A validator that checks the regression slope of a specific metric. * Waits for the regression slope to be >=0. */ let RegressionSlopeValidator = RegressionSlopeValidator_1 = class RegressionSlopeValidator extends Validator { constructor(_sampleSize, _metric) { super(); this._sampleSize = _sampleSize; this._metric = _metric; } describe() { return { 'sampleSize': this._sampleSize, 'regressionSlopeMetric': this._metric }; } validate(completeSample) { if (completeSample.length >= this._sampleSize) { const latestSample = completeSample.slice(completeSample.length - this._sampleSize, completeSample.length); const xValues = []; const yValues = []; for (let 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]); } const regressionSlope = Statistic.calculateRegressionSlope(xValues, Statistic.calculateMean(xValues), yValues, Statistic.calculateMean(yValues)); return regressionSlope >= 0 ? latestSample : null; } else { return null; } } }; RegressionSlopeValidator.SAMPLE_SIZE = new InjectionToken('RegressionSlopeValidator.sampleSize'); RegressionSlopeValidator.METRIC = new InjectionToken('RegressionSlopeValidator.metric'); RegressionSlopeValidator.PROVIDERS = [ { provide: RegressionSlopeValidator_1, deps: [RegressionSlopeValidator_1.SAMPLE_SIZE, RegressionSlopeValidator_1.METRIC] }, { provide: RegressionSlopeValidator_1.SAMPLE_SIZE, useValue: 10 }, { provide: RegressionSlopeValidator_1.METRIC, useValue: 'scriptTime' } ]; RegressionSlopeValidator = RegressionSlopeValidator_1 = __decorate([ Injectable(), __param(0, Inject(RegressionSlopeValidator_1.SAMPLE_SIZE)), __param(1, Inject(RegressionSlopeValidator_1.METRIC)), __metadata("design:paramtypes", [Number, String]) ], RegressionSlopeValidator); export { RegressionSlopeValidator }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVncmVzc2lvbl9zbG9wZV92YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iZW5jaHByZXNzL3NyYy92YWxpZGF0b3IvcmVncmVzc2lvbl9zbG9wZV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHakUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXZDOzs7R0FHRztBQUVILElBQWEsd0JBQXdCLGdDQUFyQyxNQUFhLHdCQUF5QixTQUFRLFNBQVM7SUFZckQsWUFDMEQsV0FBbUIsRUFDeEIsT0FBZTtRQUNsRSxLQUFLLEVBQUUsQ0FBQztRQUZnRCxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUN4QixZQUFPLEdBQVAsT0FBTyxDQUFRO0lBRXBFLENBQUM7SUFFUSxRQUFRO1FBQ2YsT0FBTyxFQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLHVCQUF1QixFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUMsQ0FBQztJQUNqRixDQUFDO0lBRVEsUUFBUSxDQUFDLGNBQStCO1FBQy9DLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQzdDLE1BQU0sWUFBWSxHQUNkLGNBQWMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7WUFDN0IsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO1lBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM1QyxtREFBbUQ7Z0JBQ25ELG9FQUFvRTtnQkFDcEUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLHdCQUF3QixDQUN0RCxPQUFPLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzFGLE9BQU8sZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDbkQ7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0NBQ0YsQ0FBQTtBQXhDUSxvQ0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFDeEUsK0JBQU0sR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQy9ELGtDQUFTLEdBQUc7SUFDakI7UUFDRSxPQUFPLEVBQUUsMEJBQXdCO1FBQ2pDLElBQUksRUFBRSxDQUFDLDBCQUF3QixDQUFDLFdBQVcsRUFBRSwwQkFBd0IsQ0FBQyxNQUFNLENBQUM7S0FDOUU7SUFDRCxFQUFDLE9BQU8sRUFBRSwwQkFBd0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBQztJQUM3RCxFQUFDLE9BQU8sRUFBRSwwQkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBQztDQUNuRSxDQUFDO0FBVlMsd0JBQXdCO0lBRHBDLFVBQVUsRUFBRTtJQWNOLFdBQUEsTUFBTSxDQUFDLDBCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLFdBQUEsTUFBTSxDQUFDLDBCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFBOztHQWRqQyx3QkFBd0IsQ0F5Q3BDO1NBekNZLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge01lYXN1cmVWYWx1ZXN9IGZyb20gJy4uL21lYXN1cmVfdmFsdWVzJztcbmltcG9ydCB7U3RhdGlzdGljfSBmcm9tICcuLi9zdGF0aXN0aWMnO1xuaW1wb3J0IHtWYWxpZGF0b3J9IGZyb20gJy4uL3ZhbGlkYXRvcic7XG5cbi8qKlxuICogQSB2YWxpZGF0b3IgdGhhdCBjaGVja3MgdGhlIHJlZ3Jlc3Npb24gc2xvcGUgb2YgYSBzcGVjaWZpYyBtZXRyaWMuXG4gKiBXYWl0cyBmb3IgdGhlIHJlZ3Jlc3Npb24gc2xvcGUgdG8gYmUgPj0wLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHtcbiAgc3RhdGljIFNBTVBMRV9TSVpFID0gbmV3IEluamVjdGlvblRva2VuKCdSZWdyZXNzaW9uU2xvcGVWYWxpZGF0b3Iuc2FtcGxlU2l6ZScpO1xuICBzdGF0aWMgTUVUUklDID0gbmV3IEluamVjdGlvblRva2VuKCdSZWdyZXNzaW9uU2xvcGVWYWxpZGF0b3IubWV0cmljJyk7XG4gIHN0YXRpYyBQUk9WSURFUlMgPSBbXG4gICAge1xuICAgICAgcHJvdmlkZTogUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yLFxuICAgICAgZGVwczogW1JlZ3Jlc3Npb25TbG9wZVZhbGlkYXRvci5TQU1QTEVfU0laRSwgUmVncmVzc2lvblNsb3BlVmFsaWRhdG9yLk1FVFJJQ11cbiAgICB9LFxuICAgIHtwcm92aWRlOiBSZWdyZXNzaW9uU2xvcGVWYWxpZGF0b3IuU0FNUExFX1NJWkUsIHVzZVZhbHVlOiAxMH0sXG4gICAge3Byb3ZpZGU6IFJlZ3Jlc3Npb25TbG9wZVZhbGlkYXRvci5NRVRSSUMsIHVzZVZhbHVlOiAnc2NyaXB0VGltZSd9XG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBASW5qZWN0KFJlZ3Jlc3Npb25TbG9wZVZhbGlkYXRvci5TQU1QTEVfU0laRSkgcHJpdmF0ZSBfc2FtcGxlU2l6ZTogbnVtYmVyLFxuICAgICAgQEluamVjdChSZWdyZXNzaW9uU2xvcGVWYWxpZGF0b3IuTUVUUklDKSBwcml2YXRlIF9tZXRyaWM6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBkZXNjcmliZSgpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgcmV0dXJuIHsnc2FtcGxlU2l6ZSc6IHRoaXMuX3NhbXBsZVNpemUsICdyZWdyZXNzaW9uU2xvcGVNZXRyaWMnOiB0aGlzLl9tZXRyaWN9O1xuICB9XG5cbiAgb3ZlcnJpZGUgdmFsaWRhdGUoY29tcGxldGVTYW1wbGU6IE1lYXN1cmVWYWx1ZXNbXSk6IE1lYXN1cmVWYWx1ZXNbXXxudWxsIHtcbiAgICBpZiAoY29tcGxldGVTYW1wbGUubGVuZ3RoID49IHRoaXMuX3NhbXBsZVNpemUpIHtcbiAgICAgIGNvbnN0IGxhdGVzdFNhbXBsZSA9XG4gICAgICAgICAgY29tcGxldGVTYW1wbGUuc2xpY2UoY29tcGxldGVTYW1wbGUubGVuZ3RoIC0gdGhpcy5fc2FtcGxlU2l6ZSwgY29tcGxldGVTYW1wbGUubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHhWYWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCB5VmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXRlc3RTYW1wbGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gRm9yIG5vdywgd2Ugb25seSB1c2UgdGhlIGFycmF5IGluZGV4IGFzIHggdmFsdWUuXG4gICAgICAgIC8vIFRPRE8odGJvc2NoKTogdGhpbmsgYWJvdXQgd2hldGhlciB3ZSBzaG91bGQgdXNlIHRpbWUgaGVyZSBpbnN0ZWFkXG4gICAgICAgIHhWYWx1ZXMucHVzaChpKTtcbiAgICAgICAgeVZhbHVlcy5wdXNoKGxhdGVzdFNhbXBsZVtpXS52YWx1ZXNbdGhpcy5fbWV0cmljXSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWdyZXNzaW9uU2xvcGUgPSBTdGF0aXN0aWMuY2FsY3VsYXRlUmVncmVzc2lvblNsb3BlKFxuICAgICAgICAgIHhWYWx1ZXMsIFN0YXRpc3RpYy5jYWxjdWxhdGVNZWFuKHhWYWx1ZXMpLCB5VmFsdWVzLCBTdGF0aXN0aWMuY2FsY3VsYXRlTWVhbih5VmFsdWVzKSk7XG4gICAgICByZXR1cm4gcmVncmVzc2lvblNsb3BlID49IDAgPyBsYXRlc3RTYW1wbGUgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==