Skip to content

程序员数学 07:统计、分位数与指标汇总 ​

平均耗时下降,不代表最慢的一批任务变快;两个分组的成功率各有一个百分比,也不能直接求平均。统计的第一步是明确观测对象、分母、时间范围和采样方式。

平均数与分位数回答不同问题 ​

一组原创耗时样本共 20 条:18 条是 10 ms,一条是 100 ms,一条是 1000 ms。

平均数为:

x¯=18×10+100+100020=64 ms.

中位数为 10 ms。平均数受慢任务拉高,而中位数只描述中间位置;两者都不能完整代表尾部。

本篇采用最近秩定义:先从小到大排序,0<p≤1 时,p 分位数取第 ⌈pn⌉ 个值,下标从 1 开始。于是 P95 取第 19 个值,为 100 ms;P99 取第 20 个值,为 1000 ms。

js
const samples = [...Array(18).fill(10), 100, 1000];
const sorted = [...samples].sort((a, b) => a - b);
const mean = samples.reduce((sum, x) => sum + x, 0) / samples.length;
console.log(mean); // 64
console.log(sorted[Math.ceil(0.95 * sorted.length) - 1]); // 100
console.log(sorted[Math.ceil(0.99 * sorted.length) - 1]); // 1000

不同统计工具可能采用插值或近似直方图算法;比较报表前要统一定义。只有 20 条样本时,P99 在这个定义下就是最大值,无法精细描述总体的百分之一尾部。

比例汇总必须回到分子分母 ​

假设分组 A 成功 90 次、尝试 100 次;B 成功 1 次、尝试 10 次。整体成功率应为:

90+1100+10=91110≈82.73%.

直接平均 90% 与 10% 得到 50%,对应的是“两个组同等权重的平均成功率”,不是“全部尝试的成功率”。这两项都可以有定义,但必须明确读者需要哪一个。

平均耗时合并也要按样本数加权。分位数更特殊:不能只把各分组的 P95 加权平均得到总体 P95,需要合并原始数据或使用可合并的分布摘要,并说明近似误差。

指标变化不自动证明因果 ​

某次发布后耗时从 80 ms 降到 50 ms,可能来自代码优化,也可能因为大文件减少、缓存已预热、机器规格变化或失败任务没被计入。比较时至少对齐输入类型、样本量、时间窗与成功/失败口径。

随机抽样也会波动。100 次中没有失败,只能说这 100 次没有观察到失败,不能证明真实失败概率为零。如果要判断两个方案的总体差异,需要进一步设计可比实验和不确定性分析,不能只看一张小样本截图。

练习 ​

  1. A 组 10 次任务平均 20 ms,B 组 90 次平均 100 ms,总平均是多少?
  2. 最近秩定义下,排序样本 [1, 2, 3, 4, 100] 的 P80 是多少?
  3. 各机器 P95 都下降,能否只凭这些数值断言总体 P95 下降?
查看答案与讲解
  1. (10×20+90×100)/100=92 ms,不是 60 ms。
  2. 第 ⌈0.8×5⌉=4 个值,即 4。
  3. 不能仅由分位数判断。机器间流量权重和分布都可能变化,应合并同口径的数据或分布摘要后再算。

资料与延伸 ​

Google SRE 的分布式系统监控章节 讨论了延迟等信号以及平均值掩盖尾部的问题。将这些思想用于本地性能测试时,也要同时记录样本数、分布、失败数与测试条件。

继续阅读