预取用可预测性换取感知速度
别名: 预取换速度 · 预测下一页 · speculative fetch
概念解释
预取(prefetch)在人还没发出「我要这个」之前,就把很可能要的资源取到本地。它买的不是真的少做功,是把功挪到当前等待之外,让下一次操作撞上已热的缓存,于是感知速度上升。交换物是可预测性:下一跳足够像一条熟路——搜索结果的第一条、向导的下一步、悬停已久的链接——预取才是在下注而不是在买彩票。
预加载(preload)常指当前页马上要用、只是想提前开始传的关键资源,和「下一跳」的预取不同;两者都在用时间换等待,但预测对象一个是本页关键路径,一个是人的下一步。
机制
人感知到的等待,是从发出意图到看见结果。若结果的字节在意图之前已经在路上甚至已经落地,这段等待可以短到落入即时或连续思维的窗口,操作就会被编成「页面早就在」。可预测性来自稳定的任务结构:列表里点第一项的概率远高于点第二十项;读完一屏文章后「下一章」是高概率;光标在链路上停留超过某阈值,点击概率上升。系统把这些结构读成赌注,把带宽提前花在赌注上。
预取成功时,慢的部分发生在人还在读当前屏、还在做别的决定的时间里,那些时间本来就要花,于是被「藏」进了无等待的间隙。失败的赌注把同一种藏法变成浪费,代价是多花的流量、电量和白取的数据;这里只算正向账本:没有可预测的下一跳,就没有正当的预取;有了,感知速度来自错开,不是来自魔法。
边界
隐私和登录态会让「看起来像下一跳」的资源其实不能提前拿(个性化、权限、一次性链接),预取会取到错身份的数据或把一次性票用掉。可预测性随人而变:专家走快捷键、新手走第一条,按全局第一项预取会系统性偏。当前页自己还在抢带宽时,预取会拖慢正在看的东西,感知速度在下一跳赚、在这一跳赔,总账可能是负。预取不能把必须确认的操作(付款、发送)偷偷做完——取的是读,不是提交。
怎么落地
- 只对高概率下一跳预取:明确的「下一步」、结果列表的头部、悬停稳定的链接。不要对整站每个链接都下手。
- 预取在当前页关键路径空闲之后再开始,避免跟正在读的内容抢管道。
- 把预取当只读:缓存渲染所需的数据,不要触发会改服务器状态的请求。
- 验证:在典型任务里看从点击到第一帧内容。若预取命中的路径明显短于冷路径,且当前页的滚动和播放没有因此卡,这笔交换才算做成。