I2.04.3wrong prefetch yields nothing设计
预取错误会浪费资源且无收益
别名: 预取未命中 · 赌错下一跳 · prefetch miss
概念解释
预取是赌注。赌错——人去了别的地方、预测的对象已过期、取到的是错版本——流量和电量已经花了,下一跳的等待却一点没少。这叫未命中(miss):负项照付,正项为零。错误不是「稍微慢一点」,是这笔预取从账本上删除。继续用同一条规则去赌,只会稳定地制造无收益的开销。
机制
命中需要两头同时对:对象对,时机对。对象错:悬停的是开小差,真正要点的是旁边那条;列表第一项的全局概率套在一个专门来找第二十项的人身上。时机错:取的时候内容还对,点的时候已经换了库存、换了权限、换了会话。还有一种错是语义上的:预取把要提交的草稿或一次性链接提前消费了,人真正操作时面对的是「已用过」或「不是刚才那份」。
未命中的隐蔽处在于界面可以毫无变化——下一跳仍转圈,像从没预取过。开销在无线电和账单里,不在像素里,所以产品会长期看不见自己在输。更糟的是错误会污染缓存:错身份、错实验分组的页面被存下来,下一次「命中」变成一次悄悄的错内容,负项从浪费升级成错误呈现。
边界
探索性浏览的命中率天然低,用阅读器「下一章」的成功率去要求逛商店的每一张卡,会把这条写成禁预取。允许的做法是把赌注下在真的窄的地方,并接受探索路径不预取。预取元数据失败和预取整页失败量级不同:轻量未命中可以当学习信号(这条规则不适合这类用户),整页视频未命中是事故。用户显式取消、返回、关掉页,应立刻作废对应赌注,不要把已经无用的传输跑完。命中率低但一旦命中收益极大(冷启动很大的编辑器)时,可以保留很窄的预取,但必须能证明未命中率被预算闸住,而不是靠「万一呢」活着。
怎么落地
- 给每条预取规则记命中率。持续低于阈值就关规则,不要靠个别成功体验续命。
- 预取结果必须带身份与时效:换用户、换权限、过期则丢弃,禁止把未命中的错误缓存当成下一次的快。
- 用户离开预测路径(返回、关页、选了别的项)时取消进行中的预取。
- 验证:看一周的预取日志。若某规则大部分传输从未被那次会话用上,而下一跳的等待分布与关掉预取时相同,这条规则就是在稳定地买无收益。