зеркало из https://github.com/mozilla/gecko-dev.git
132 строки
3.1 KiB
JavaScript
132 строки
3.1 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/**
|
|
* Create an interface to measure iterations for a micro benchmark. These iterations
|
|
* will then be reported to the perftest runner.
|
|
*
|
|
* @param {string} metricName
|
|
*/
|
|
function measureIterations(metricName) {
|
|
let accumulatedTime = 0;
|
|
let iterations = 0;
|
|
let now = 0;
|
|
return {
|
|
/**
|
|
* Start a measurement.
|
|
*/
|
|
start() {
|
|
now = Cu.now();
|
|
},
|
|
/**
|
|
* Stop a measurement, and record the elapsed time.
|
|
*/
|
|
stop() {
|
|
accumulatedTime += Cu.now() - now;
|
|
iterations++;
|
|
},
|
|
/**
|
|
* Report the metrics to perftest after finishing the microbenchmark.
|
|
*/
|
|
reportMetrics() {
|
|
const metrics = {};
|
|
metrics[metricName + " iterations"] = iterations;
|
|
metrics[metricName + " accumulatedTime"] = accumulatedTime;
|
|
metrics[metricName + " perCallTime"] = accumulatedTime / iterations;
|
|
|
|
info("perfMetrics", metrics);
|
|
},
|
|
};
|
|
}
|
|
|
|
let _seed = 123456;
|
|
/**
|
|
* A cheap and simple pseudo-random number generator that avoids adding new dependencies.
|
|
* This function ensures tests are repeatable, but can be fed random configurations.
|
|
*
|
|
* https://en.wikipedia.org/wiki/Linear_congruential_generator
|
|
*
|
|
* It has the following distribution for the first 100,000 runs:
|
|
*
|
|
* 0.0 - 0.1: 9948
|
|
* 0.1 - 0.2: 10037
|
|
* 0.2 - 0.3: 10049
|
|
* 0.3 - 0.4: 10041
|
|
* 0.4 - 0.5: 10036
|
|
* 0.5 - 0.6: 10085
|
|
* 0.6 - 0.7: 9987
|
|
* 0.7 - 0.8: 9872
|
|
* 0.8 - 0.9: 10007
|
|
* 0.9 - 1.0: 9938
|
|
*
|
|
* @returns {number} float values ranged 0-1
|
|
*/
|
|
function prng() {
|
|
_seed = Math.imul(_seed, 22695477) + 1;
|
|
return (_seed >> 1) / 0x7fffffff + 0.5;
|
|
}
|
|
|
|
/**
|
|
* The distribution of locales. The number represents the ratio of total users in that
|
|
* locale. The numbers should add up to ~1.0.
|
|
*
|
|
* https://sql.telemetry.mozilla.org/dashboard/firefox-localization
|
|
*/
|
|
const localeDistribution = {
|
|
"en-US": 0.373,
|
|
de: 0.129,
|
|
fr: 0.084,
|
|
"zh-CN": 0.053,
|
|
ru: 0.048,
|
|
"es-ES": 0.047,
|
|
pl: 0.041,
|
|
"pt-BR": 0.034,
|
|
it: 0.028,
|
|
"en-GB": 0.027,
|
|
ja: 0.019,
|
|
"es-MX": 0.014,
|
|
nl: 0.01,
|
|
cs: 0.009,
|
|
hu: 0.008,
|
|
id: 0.006,
|
|
"en-CA": 0.006,
|
|
"es-AR": 0.006,
|
|
tr: 0.005,
|
|
el: 0.005,
|
|
"zh-TW": 0.005,
|
|
fi: 0.005,
|
|
"sv-SE": 0.004,
|
|
"pt-PT": 0.004,
|
|
sk: 0.003,
|
|
ar: 0.003,
|
|
vi: 0.003,
|
|
"es-CL": 0.002,
|
|
th: 0.002,
|
|
da: 0.002,
|
|
bg: 0.002,
|
|
ro: 0.002,
|
|
"nb-NO": 0.002,
|
|
ko: 0.002,
|
|
};
|
|
|
|
/**
|
|
* Go through the top Firefox locales, and pick one at random that is representative
|
|
* of the Firefox population as of 2021-06-03. It uses a pseudo-random number generator
|
|
* to make the results repeatable.
|
|
*
|
|
* @returns {string} locale
|
|
*/
|
|
function pickRepresentativeLocale() {
|
|
const n = prng();
|
|
let ratio = 1;
|
|
for (const [locale, representation] of Object.entries(localeDistribution)) {
|
|
ratio -= representation;
|
|
if (n > ratio) {
|
|
return locale;
|
|
}
|
|
}
|
|
// In case we fall through the "for" loop, return the most common locale.
|
|
return "en-US";
|
|
}
|