5d3150d71d6968cf4e52051b4991b3a2922adb4b
[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
72         if (!unit)
73             return function (value) { return value.toFixed(2) + ' ' + (unit || ''); }
74
75         var divisor = unit == 'B' ? 1024 : 1000;
76         var suffix = ['\u03BC', 'm', '', 'K', 'M', 'G', 'T', 'P', 'E'];
77         var threshold = sigFig >= 3 ? divisor : (divisor / 10);
78         return function (value) {
79             var i;
80             var sign = value >= 0 ? (alwaysShowSign ? '+' : '') : '-';
81             value = Math.abs(value);
82             for (i = isMiliseconds ? 1 : 2; value < 1 && i > 0; i--)
83                 value *= divisor;
84             for (; value >= threshold; i++)
85                 value /= divisor;
86             return sign + value.toPrecision(Math.max(2, sigFig)) + ' ' + suffix[i] + (unit || '');
87         }
88     };
89 }
90
91 if (typeof module != 'undefined')
92     module.exports.Metric = Metric;