我们使用 Google PageSpeed Insights 作为营销工具来比较我们与竞争对手的网站的下载速度。但是这么多移动网站的评级都在 30 年代,想知道这是否就是平均移动评级。有人知道吗?谢谢
1 回答
简答
移动平均评分为 31。
长答案。
我在写完以下内容后发现的一篇文章回答了这个问题
这篇来自 tunetheweb的文章实际上已经在这里为我们完成了艰苦的工作,并从 httparchive 收集了数据。(阅读这篇文章,它有很多有趣的信息!)
下表摘自该文章涵盖了您的问题(性能指标第 50 个百分位的答案是 31)
Percentile Performance Accessibility Best Practices SEO PWA
10 8 56 64 69 14
25 16 69 64 80 25
50 31 80 71 86 29
75 55 88 79 92 36
90 80 95 86 99 54
95 93 97 93 100 54
99 99 100 93 100 64
我把下面的信息留在了下面,因为这些信息可能对某人有用,但上面的内容更好地回答了这个问题。至少我对 35 的猜测与实际答案相距几百万英里。呵呵。
我的原始答案
你会想象50分是平均分吧?没有!
Lighthouse 使用对数正态曲线来创建指示分数的曲线。
该曲线上的两个关键控制点是中位数的第 25 个百分位(50 分意味着您实际上处于前 25%)和 90 分的第 8 个百分位。
用于确定这些点的数字来自http 存档数据。
您可以在此处作为示例探索用于交互时间评分的曲线。
现在我确信数学比我好得多的人可以使用该数据来计算网站的平均分数,但我估计移动网站的平均分数约为 35,这与您观察到的非常接近.
我可以做的一件事是根据这些控制点提供评分的工作方式,以便您可以查看每个指标的各种截止点等。
以下内容取自https://github.com/paulirish/lh-scorecalc/tree/190bed715a3589601f314b3c8a50fb0fb147c121的数学模块
我还在变量中包含了当前在此计算中使用的中值和衰减值scoring
。
要使用它,请使用该VALUE_AT_QUANTILE
函数来获取达到某个百分比所需的值(因此要查看 Time To Interactive 的第 90 个百分位数的值,您将使用VALUE_AT_QUANTILE(7300, 2900, 0.9);
(从 TTI 中获取中值(7300)和衰减(2900))scoring
变量,然后以小数形式输入所需的百分位数 (90 -> 0.9)) 。
类似的QUANTILE_AT_VALUE
功能相反(显示特定值将落在的百分位数)。例如,如果您想查看第一个 CPU 空闲时间为 3200 的百分位数,您将使用QUANTILE_AT_VALUE(6500, 2900, 3200)
.
无论如何,我已经有点离题了,但希望上面和下面的内容能让比我更聪明的人获得解决问题所需的信息(我已经在weights
变量中包含了每个项目的权重)。
const scoring = {
FCP: {median: 4000, falloff: 2000, name: 'First Contentful Paint'},
FMP: {median: 4000, falloff: 2000, name: 'First Meaningful Paint'},
SI: {median: 5800, falloff: 2900, name: 'Speed Index'},
TTI: {median: 7300, falloff: 2900, name: 'Time to Interactive'},
FCI: {median: 6500, falloff: 2900, name: 'First CPU Idle'},
TBT: {median: 600, falloff: 200, name: 'Total Blocking Time'}, // mostly uncalibrated
LCP: {median: 4000, falloff: 2000, name: 'Largest Contentful Paint'},
CLS: {median: 0.25, falloff: 0.054, name: 'Cumulative Layout Shift', units: 'unitless'},
};
const weights = {
FCP: 0.15,
SI: 0.15,
LCP: 0.25,
TTI: 0.15,
TBT: 0.25,
CLS: 0.05
};
function internalErf_(x) {
// erf(-x) = -erf(x);
var sign = x < 0 ? -1 : 1;
x = Math.abs(x);
var a1 = 0.254829592;
var a2 = -0.284496736;
var a3 = 1.421413741;
var a4 = -1.453152027;
var a5 = 1.061405429;
var p = 0.3275911;
var t = 1 / (1 + p * x);
var y = t * (a1 + t * (a2 + t * (a3 + t * (a4 + t * a5))));
return sign * (1 - y * Math.exp(-x * x));
}
function internalErfInv_(x) {
// erfinv(-x) = -erfinv(x);
var sign = x < 0 ? -1 : 1;
var a = 0.147;
var log1x = Math.log(1 - x*x);
var p1 = 2 / (Math.PI * a) + log1x / 2;
var sqrtP1Log = Math.sqrt(p1 * p1 - (log1x / a));
return sign * Math.sqrt(sqrtP1Log - p1);
}
function VALUE_AT_QUANTILE(median, falloff, quantile) {
var location = Math.log(median);
var logRatio = Math.log(falloff / median);
var shape = Math.sqrt(1 - 3 * logRatio - Math.sqrt((logRatio - 3) * (logRatio - 3) - 8)) / 2;
return Math.exp(location + shape * Math.SQRT2 * internalErfInv_(1 - 2 * quantile));
}
function QUANTILE_AT_VALUE(median, falloff, value) {
var location = Math.log(median);
var logRatio = Math.log(falloff / median);
var shape = Math.sqrt(1 - 3 * logRatio - Math.sqrt((logRatio - 3) * (logRatio - 3) - 8)) / 2;
var standardizedX = (Math.log(value) - location) / (Math.SQRT2 * shape);
return (1 - internalErf_(standardizedX)) / 2;
}
console.log("Time To Interactive (TTI) 90th Percentile Time:", VALUE_AT_QUANTILE(7300, 2900, 0.9).toFixed(0));
console.log("First CPU Idle time of 3200 score / percentile:", (QUANTILE_AT_VALUE(6500, 2900, 3200).toFixed(3)) * 100);