单线程

四季春风,不厌冬

  1. 局部性分类
    1. 时间局部性
    2. 空间局部性
  2. 利用局部性优势
    1. 数据缓存
    2. 连续读数据
    3. 系统优化
    4. 工作收益率
  3. 规避局部性劣势

  
  在计算机科学领域,访问局部性(英语:Locality of reference)指的是应用程序在访问内存的时候,倾向于访问内存中较为靠近的值。
  
  局部性的本质是概率的不均等,即事件发生在少量空间中或者某段时间内。无论是计算机科学领域,还是其他领域,甚至整个社会、整个世界,也遵从局部性原理,程序运行、资源分配都是不均等的。

局部性分类

  访问局部性分为两种基本形式,一种是时间局部性,另一种是空间局部性。

时间局部性

  时间局部性指的是,程序在运行时,最近刚刚被引用过的一个内存位置容易再次被引用,比如在调取一个函数的时候,前不久才调取过的本地参数容易再度被调取使用。
–《维基百科》

空间局部性

  空间局部性指的是,最近引用过的内存位置以及其周边的内存位置容易再次被使用。
–《维基百科》

利用局部性优势

数据缓存

  常见的内存数据库Redis/Mecached,最基本的功能便是将热点数据存储在内存中,以提升数据的访问速率。相似做法在Hibernate/Mybatis中也能找到,两类数据持久化框架皆可以缓存部分SQL语句及对应的持久化对象,以便后续部分请求可以命中缓存,无需访问数据库。

连续读数据

  cpu访问目标地址时,也会加载周边地址,比如MySQL,B+树连续的叶子节点将会被一同查询出来;遍历数组比遍历链表更快(因为数组是连续地址块,访问一次地址也访问了周边的地址)。对于二维数组的遍历,尽量行访问,即外层行循环,内层列循环,因为内存是行分配。
  
  以前做过一个C端滚动分页功能,智能机流畅的滑屏已经将分页体验做的很好了,几乎每个人都会自然地滑屏查看后续的内容,为了提升浏览体验,我们将系统设计成首次接收分页请求后,实时查询出当前请求页的数据,同时异步查询出下一页的数据,并将预读的数据保存至缓存,等待第二次请求到来时,优先匹配缓存数据,同时异步查询出下一页的数据,保存至缓存,以此类推。

系统优化

  当我们的应用服务需要优化的时候,先从哪里开始呢?找出最耗cpu、最耗内存、最耗时的接口开始,可以利用诸如jstack的工具来分析并整理出需要优化的接口。接口的性能不可能是平均分布的,最占资源的接口总是那么几个,这正是局部性原理带来的便利性。   

工作收益率

  无论是软件开发,还是产品运营,任何工作都有主次之分,并且人的精力也是有限的,我们不可能对每件事情都同样上心,付出一样的成本,我们必须优先做高收益率的事情,这样可以明显提高工作效率。工作中收益率的局部性决定了只有少数事情有高收益率。在二八法则中,80%的收益率来自20%的工作,局部性告诉我们永远关注最重要的20%

规避局部性劣势

  任何事物都具有双面性,掌握局部性原理带给我们便利的同时,也需要规避它产生的隐患。比如数据热点会导致某些单节点成为整个集群的瓶颈,其他节点却很闲。
  此时我们需要重新hash打乱数据,让数据尽可能均匀分布。

本文作者 : pengqin.zhou
本文使用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
本文链接 : https://www.zhoupq.com/blog/%E5%9F%BA%E4%BA%8E%E5%B1%80%E9%83%A8%E6%80%A7%E5%8E%9F%E7%90%86%E7%9A%84%E4%BC%98%E5%8C%96/

本文最后更新于 天前,文中所描述的信息可能已发生改变