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