一、线上事故:结算平均耗时 8 毫秒看着健康,玩家却喊卡——平均数掩盖长尾,P95 高达 95 毫秒的那 5% 请求才是卡顿来源;性能要看分位不看均值。
二、底层原理:分位数先排序再取位:P95 取第 ceil(0.95乘n) 个元素,代表 95% 的请求都慢不过它;与平均数不同,分位对长尾敏感,是体验的真实刻画。
三、正确代码:
错误写法。示例代码如下:
local function avgCost(samples)
local sum = 0
for _, v in ipairs(samples) do sum = sum + v end
return sum / #samples -- 均值8毫秒,长尾全被平均
end
正确写法。示例代码如下:
-- 裁决之杖结算耗时样本
local function p95(samples)
table.sort(samples)
local idx = math.ceil(#samples * 0.95)
return samples[idx] -- 95%请求慢不过它
end
sendmsg(actor, 1, "结算P95 "
.. p95({3, 4, 4, 5, 5, 5, 6, 6, 95, 7}) .. " 毫秒")
四、引擎验证:1000 个耗时样本:均值 8 毫秒显健康;P95 95 毫秒暴露长尾,定位到 5% 的重定价请求,修复后 P95 降至 11 毫秒。
五、FAQ:问:P95 与 P99 选哪个?答:核心链路看 P99,一般业务 P95 足够。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、业务场景 帮会成员各自打怪缺乏交流,武艺高低无从比较。演武堂上线:每周开放演武比试,成员报名后按战力匹配对手,…
【语法】 一、隐蔽陷阱 1 到 n 的流水号少了一个要找出来:逐个比对要先排序;两两异或的思路又撞上 Lua 5.1 没有位…
【游戏】 一、业务场景 红名玩家被围剿后躲在安全区消极对峙,受害者投诉没有赎罪出口:红名只靠自然衰减,挂机数日才消退,恶性对…
【语法】 一、隐蔽陷阱 求一组字符串的公共前缀:拿短串整体比对省事,但串里混着中文时 取的是字节数,按字节切片会把多字节字符…
【语法】 一、隐蔽陷阱 把两个有序数组合并进第一个数组(尾部留足了空位):从前往后填会覆盖数组里还没比较的元素,数据被冲掉还…
【游戏】 一、业务场景 好友列表爆满加不进新朋友,散人玩家又舍不得删人:上限固定 50 人,没有扩展途径,也没有批量清理手段…