Bug 1869647 - Mark hasStorageAccess.sub.https.window.html as intermittent after wpt...
[gecko.git] / intl / benchmarks / head.js
blob96250484a8f1cf558fccbb70a17e36fa86ceb7b1
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 /**
6  * Create an interface to measure iterations for a micro benchmark. These iterations
7  * will then be reported to the perftest runner.
8  *
9  * @param {string} metricName
10  */
11 function measureIterations(metricName) {
12   let accumulatedTime = 0;
13   let iterations = 0;
14   let now = 0;
15   return {
16     /**
17      * Start a measurement.
18      */
19     start() {
20       now = Cu.now();
21     },
22     /**
23      * Stop a measurement, and record the elapsed time.
24      */
25     stop() {
26       accumulatedTime += Cu.now() - now;
27       iterations++;
28     },
29     /**
30      * Report the metrics to perftest after finishing the microbenchmark.
31      */
32     reportMetrics() {
33       const metrics = {};
34       metrics[metricName + " iterations"] = iterations;
35       metrics[metricName + " accumulatedTime"] = accumulatedTime;
36       metrics[metricName + " perCallTime"] = accumulatedTime / iterations;
38       info("perfMetrics", metrics);
39     },
40   };
43 let _seed = 123456;
44 /**
45  * A cheap and simple pseudo-random number generator that avoids adding new dependencies.
46  * This function ensures tests are repeatable, but can be fed random configurations.
47  *
48  * https://en.wikipedia.org/wiki/Linear_congruential_generator
49  *
50  * It has the following distribution for the first 100,000 runs:
51  *
52  *    0.0 - 0.1: 9948
53  *    0.1 - 0.2: 10037
54  *    0.2 - 0.3: 10049
55  *    0.3 - 0.4: 10041
56  *    0.4 - 0.5: 10036
57  *    0.5 - 0.6: 10085
58  *    0.6 - 0.7: 9987
59  *    0.7 - 0.8: 9872
60  *    0.8 - 0.9: 10007
61  *    0.9 - 1.0: 9938
62  *
63  * @returns {number} float values ranged 0-1
64  */
65 function prng() {
66   _seed = Math.imul(_seed, 22695477) + 1;
67   return (_seed >> 1) / 0x7fffffff + 0.5;
70 /**
71  * The distribution of locales. The number represents the ratio of total users in that
72  * locale. The numbers should add up to ~1.0.
73  *
74  * https://sql.telemetry.mozilla.org/dashboard/firefox-localization
75  */
76 const localeDistribution = {
77   "en-US": 0.373,
78   de: 0.129,
79   fr: 0.084,
80   "zh-CN": 0.053,
81   ru: 0.048,
82   "es-ES": 0.047,
83   pl: 0.041,
84   "pt-BR": 0.034,
85   it: 0.028,
86   "en-GB": 0.027,
87   ja: 0.019,
88   "es-MX": 0.014,
89   nl: 0.01,
90   cs: 0.009,
91   hu: 0.008,
92   id: 0.006,
93   "en-CA": 0.006,
94   "es-AR": 0.006,
95   tr: 0.005,
96   el: 0.005,
97   "zh-TW": 0.005,
98   fi: 0.005,
99   "sv-SE": 0.004,
100   "pt-PT": 0.004,
101   sk: 0.003,
102   ar: 0.003,
103   vi: 0.003,
104   "es-CL": 0.002,
105   th: 0.002,
106   da: 0.002,
107   bg: 0.002,
108   ro: 0.002,
109   "nb-NO": 0.002,
110   ko: 0.002,
114  * Go through the top Firefox locales, and pick one at random that is representative
115  * of the Firefox population as of 2021-06-03. It uses a pseudo-random number generator
116  * to make the results repeatable.
118  * @returns {string} locale
119  */
120 function pickRepresentativeLocale() {
121   const n = prng();
122   let ratio = 1;
123   for (const [locale, representation] of Object.entries(localeDistribution)) {
124     ratio -= representation;
125     if (n > ratio) {
126       return locale;
127     }
128   }
129   // In case we fall through the "for" loop, return the most common locale.
130   return "en-US";