程序员数学 07:统计、分位数与指标汇总
平均耗时下降,不代表最慢的一批任务变快;两个分组的成功率各有一个百分比,也不能直接求平均。统计的第一步是明确观测对象、分母、时间范围和采样方式。
平均数与分位数回答不同问题
一组原创耗时样本共 20 条:18 条是 10 ms,一条是 100 ms,一条是 1000 ms。
平均数为:
中位数为 10 ms。平均数受慢任务拉高,而中位数只描述中间位置;两者都不能完整代表尾部。
本篇采用最近秩定义:先从小到大排序,
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% 与 10% 得到 50%,对应的是“两个组同等权重的平均成功率”,不是“全部尝试的成功率”。这两项都可以有定义,但必须明确读者需要哪一个。
平均耗时合并也要按样本数加权。分位数更特殊:不能只把各分组的 P95 加权平均得到总体 P95,需要合并原始数据或使用可合并的分布摘要,并说明近似误差。
指标变化不自动证明因果
某次发布后耗时从 80 ms 降到 50 ms,可能来自代码优化,也可能因为大文件减少、缓存已预热、机器规格变化或失败任务没被计入。比较时至少对齐输入类型、样本量、时间窗与成功/失败口径。
随机抽样也会波动。100 次中没有失败,只能说这 100 次没有观察到失败,不能证明真实失败概率为零。如果要判断两个方案的总体差异,需要进一步设计可比实验和不确定性分析,不能只看一张小样本截图。
练习
- A 组 10 次任务平均 20 ms,B 组 90 次平均 100 ms,总平均是多少?
- 最近秩定义下,排序样本
[1, 2, 3, 4, 100]的 P80 是多少? - 各机器 P95 都下降,能否只凭这些数值断言总体 P95 下降?
查看答案与讲解
ms,不是 60 ms。 - 第
个值,即 4。 - 不能仅由分位数判断。机器间流量权重和分布都可能变化,应合并同口径的数据或分布摘要后再算。
资料与延伸
Google SRE 的分布式系统监控章节 讨论了延迟等信号以及平均值掩盖尾部的问题。将这些思想用于本地性能测试时,也要同时记录样本数、分布、失败数与测试条件。
继续阅读
- 习题与解析
- 习题与解析
- 习题与解析