计算机与信息 · 4/7
缓存与局部性Caching and Locality
把反复要用的东西放在近处,用更少的取用成本换速度,并及时更新。
同一部电影被反复点开时,让它每次都走一趟远路,是重复付运输费。2012 年 6 月 4 日,总部位于美国加州洛斯加托斯的 Netflix,由内容分发负责人肯·弗洛伦斯宣布推出 Open Connect。Netflix 把存有影片副本的服务器放进合作运营商的网络,让附近观众直接取用。晚间,人们各自在家按下播放键,重复观看的影片便能从附近送来。影片没有变短,观众也没有少看;同样的内容提前放到了更容易拿到的地方。
为什么成立
需求集中时,少量副本就能省下大量往返
处理器反复执行一段循环时,会一遍遍读取同几条指令。把这些指令留在小而快的存储器里,就能少等慢速内存。这就是缓存:保留数据或计算结果,让后续请求复用。
局部性解释了为什么小缓存能管用。时间局部性是刚用过的东西,在接下来一段时间里容易再用;空间局部性是读过一个位置后,容易接着读附近的位置。循环会重复,数组会连续遍历,所以访问集中在一小片数据上。
节省多少,要看多少次能直接取到
设每次查缓存花 1 毫秒,没找到后再取原始数据花 100 毫秒。若十次请求有九次命中,平均耗时是 11 毫秒。
这里 是查缓存的时间, 是命中率, 是未命中后额外取数的时间。白话说:每次都付查找费,只有没找到时才付远路费。缓存越能留住接下来要用的东西,平均等待越短。
快的位置有限,旧副本也会失效
缓存装满后,必须腾出位置。淘汰最久没用的条目,是利用近期需求预测下一次需求;长期高频的条目,也值得保留。原始数据改变时,副本要更新或作废。缓存值得保留的条件,是复用省下的成本超过存放、维护和用错旧副本的代价。
出处
这个模型来自计算机体系结构与操作系统,缓存并非一人一次发明。彼得·丹宁于 1967 年公开提出工作集模型,并于 1968 年发表期刊论文,用近期访问的数据集合描述程序需求。IBM 在 1968 年的 System/360 Model 85 中采用高速缓存;随后对工作集管理的实验,验证了保留近期所用数据能减少慢速存储访问。
换个领域看
技术
让处理器少等
IBM 在 1968 年公布的 System/360 Model 85,把小容量高速缓存放在处理器与主存之间。程序再次读取已缓存的数据时,就能从快处取得。它利用程序反复访问少量指令和数据的习惯,让昂贵的高速存储只覆盖眼前常用的部分。
个人生活
把早餐放手边
早餐天天做同几样东西,就值得给它们留一个近处的位置。每天早晨冲咖啡的人,把杯子、滤纸和咖啡豆放在机器旁,备用存货留在高柜。每次用完归位,滤纸快用尽时补充。少量常用品占住方便的位置,换来每天少翻几次柜子、少走几趟路。
投资
保留研究底稿
每季度跟踪同一家上市公司时,研究底稿能省掉重复找资料的时间。投资者把收入分类、债务到期表和财报页码存进固定文件,新财报发布后沿着这些入口更新数字。稳定的资料结构可以复用,估值所用的价格和盈利预测则随新信息刷新,下一次研究从已核实的事实接着做。
遇事时问自己
- 最近反复取用或重新计算的东西有哪些,每次花了多少时间?
- 接下来还会重复这些需求吗,哪些刚用过的东西最值得留在手边?
- 哪些东西会接连一起用,放在一起能省掉哪些往返?
- 方便的位置只能放有限几样东西,谁省下的取用成本最多?
- 原始信息改变后,什么信号会提醒我更新或丢弃旧副本?
边界与误用
需求只出现一次、访问分散,或任务切换快过复用速度时,缓存会忙着装入又淘汰,省不下多少取用成本。必须读取最新库存、账户余额等数据时,旧副本还会造成错误,要先保证更新及时。最常见的误用,是把“最近用过”当成“值得一直保留”,甚至把熟悉的结论当成可靠的结论。近期使用只能帮助预测复用,不能证明内容正确。安全装备等低频但后果重大的物品,也应按紧急取用的代价安排位置。
练一练
一位译员正在翻译输液泵操作手册,几个部件名会反复出现。查正式译名要翻多份文件,翻译软件的侧栏只能放 30 条。侧栏目前留着上个月游戏项目的常用词。医疗器械客户会在审稿期间修订译名,并发来更新通知。
哪种侧栏维护办法最站得住?
平均分配能照顾两类项目。但当前需求集中在医疗手册,游戏术语会挤占位置;固定每周更新也可能晚于修订通知。
全年高频词看起来最值得保留。但眼前的项目已经换了,过去常用的词未必还会用;月底核对也会漏掉期间的修订。
手册中反复出现的术语,很可能马上还要查。让它们占住近处的位置,并随客户修订更新,才能持续省时。
刚查过的词确实可能很快再用。但最早放入的词可能仍在反复使用,只看加入时间会删错,也没有处理译名更新。
侧栏能省多少时间,取决于接下来有多少次查询可以直接取到答案。当前任务让需求集中在少量术语上,位置应随任务调整;正式译名变了,留下的副本也要及时更新。
一位家长周末要缝六只帆布文具袋。每做一道接缝,都依次用划粉、直尺、夹子和剪刀,一晚要重复十几次。桌边浅盘只能放四样工具,其余放在走廊柜里。昨天补外套用过拆线器,这批文具袋暂时用不到。
怎样安排工具,最能减少今晚的来回取用?
取出费事的工具,放近后每次能省更多工夫。但还要看使用次数,今晚不用的工具再难拿,也省不下往返。
最近用过的工具容易让人觉得还会用。但昨天补外套,今晚缝文具袋,任务变了,拆线器可能挤掉今晚常用的工具。
贵重工具值得妥善保管。但价格不能说明今晚会用几次,把反复使用的工具送回远处,会增加往返。
这四样工具会反复使用,也会接连一起用。集中放在手边并归位,能让下一道接缝继续省下取用成本。
同一组工具在短时间内反复使用,留在手边就能持续减少往返。使用顺序相邻,也给集中摆放提供了依据;昨天用过什么,只能作为预测今晚需求的线索。
一位个人债券投资者准备买入一笔成交稀少的公司债。券商软件的快捷面板保留了上午询到的价格和可买数量,下午打开仍能立即显示。午间发行人公布了重大诉讼,上午报价也已超过有效期。重新向交易商询价通常要等两分钟。
此时哪种判断最站得住?
交易商提供的报价有明确来源,容易让人放心。但来源可靠不代表始终有效,报价过期后不能继续作为下单依据。
降低金额能减少部分风险敞口。但小额不能让旧报价重新有效,也不能确认交易商当前愿意卖多少。
稳定资料可以继续帮助查询,但过期报价不能代表当前交易条件。这里必须确认交易商现在愿意提供的价格和数量。
反复看到同一个数字,容易增加信心。但每次读取的都是上午那份记录,重复显示没有带来新的市场信息。
保存结果能缩短读取时间,却不能让结果自动跟上市场变化。当前成交需要有效报价,旧副本没有及时更新,就无法承担这个用途;省下等待时间不足以支持这次复用。