a1958729277cc3ef190a4495504456e408df09e8
[WebKit.git] / Websites / perf.webkit.org / public / v3 / models / metric.js
1 'use strict';
2
3 class Metric extends LabeledObject {
4     constructor(id, object)
5     {
6         super(id, object);
7         this._aggregatorName = object.aggregator;
8         object.test.addMetric(this);
9         this._test = object.test;
10         this._platforms = [];
11     }
12
13     aggregatorName() { return this._aggregatorName; }
14
15     test() { return this._test; }
16     platforms() { return this._platforms; }
17
18     addPlatform(platform)
19     {
20         console.assert(platform instanceof Platform);
21         this._platforms.push(platform);
22     }
23
24     childMetrics()
25     {
26         var metrics = [];
27         for (var childTest of this._test.childTests()) {
28             for (var childMetric of childTest.metrics())
29                 metrics.push(childMetric);
30         }
31         return metrics;
32     }
33
34     path() { return this._test.path().concat([this]); }
35
36     fullName() { return this._test.fullName() + ' : ' + this.label(); }
37
38     label()
39     {
40         var suffix = '';
41         switch (this._aggregatorName) {
42         case null:
43             break;
44         case 'Arithmetic':
45             suffix = ' : Arithmetic mean';
46             break;
47         case 'Geometric':
48             suffix = ' : Geometric mean';
49             break;
50         case 'Harmonic':
51             suffix = ' : Harmonic mean';
52             break;
53         case 'Total':
54         default:
55             suffix = ' : ' + this._aggregatorName;
56         }
57         return this.name() + suffix;
58     }
59
60     unit() { return RunsData.unitFromMetricName(this.name()); }
61     isSmallerBetter() { return RunsData.isSmallerBetter(this.unit()); }
62
63     makeFormatter(sigFig, alwaysShowSign)
64     {
65         var unit = this.unit();
66         var isMiliseconds = false;
67         if (unit == 'ms') {
68             isMiliseconds = true;
69             unit = 's';
70         }
71         var divisor = unit == 'B' ? 1024 : 1000;
72
73         var suffix = ['\u03BC', 'm', '', 'K', 'M', 'G', 'T', 'P', 'E'];
74         var threshold = sigFig >= 3 ? divisor : (divisor / 10);
75         return function (value) {
76             var i;
77             var sign = value >= 0 ? (alwaysShowSign ? '+' : '') : '-';
78             value = Math.abs(value);
79             for (i = isMiliseconds ? 1 : 2; value < 1 && i > 0; i--)
80                 value *= divisor;
81             for (; value >= threshold; i++)
82                 value /= divisor;
83             return sign + value.toPrecision(Math.max(2, sigFig)) + ' ' + suffix[i] + (unit || '');
84         }
85     };
86 }
87
88 if (typeof module != 'undefined')
89     module.exports.Metric = Metric;