Article / 文章中心

什么是程序的局部性原理

发布时间:2022-02-14 点击数:692

01、前言

作为有寻求的程序员,咱们日常在写代码的时分往往都会运用很多奇技淫巧,不单单是为了炫耀咱们的技术,更是为了寻求更高的功率。了解局部性原理,能够有效的协助咱们理解和写出更好的代码,关于局部性原理或许有的小伙伴知道,有的小伙伴不知道,知道的小伙伴就当做温习知识点,不知道的小伙伴也不要紧,接着往下看就知道了。

02、什么是局部性原理

说到局部性原理,那咱们首要要知道什么是局部性原理,局部性原理分为两部分:

  • 时刻局部性:指的是在程序运转过程中最近被引用到的存储器方位在程序履行后期还会被屡次引用到的或许性很大。
  • 空间局部性:指的是程序运转过程中如果一个存储器的方位被引用,那么在程序履行后期该存储器附近的方位被引用的或许性很大。

简略来说便是一个变量在程序运转过程中,如果被引用过一次,那后续很有或许会再被引用到;一个变量被拜访到过后,这个变量地点的方位附近的方位很有或许在程序后续运转中被拜访到。

03、示例

上面是经过理论来说明的,下面咱们经过一段代码来看看局部性y原理

public int sum(int[] array) {  int sum = 0;  for (int i = 0; i < array.length; i++) {  sum = sum + array[i];  }  return sum;  }

从上面的这段代码来看,便是一个很简略的数组元素求和,这儿咱们主要看 sum 和 array 两个变量,咱们能够看到 sum 在每次循环中都会用到,别的它仅仅一个简略变量,所以咱们能够看到,sum 是契合咱们上面说到的时刻局部性,再拜访一次后还会被持续拜访到,可是它不存在咱们所说的空间局部性了。

相反的,array 数组中的每个元素只拜访一次,别的数组底层的存储是连续的,所以 array 变量契合咱们上面说到的空间局部性,可是不契合时刻局部性。

这仅仅局部性原理的简略示例,关于局部性原理还有很多地方会用到,咱们如果能熟练的把握和运用,对咱们的协助会很大的。

04、相关应用

4.1、CPU 缓存

上面的示例其实很简略,信任大家都能理解,别的局部性原理其实在咱们日常运用的软件中随处可见,并且在操作系统中也少不了。咱们知道 CPU 的速度是非常快的,而且 CPU 与内存之间有多级缓存,如下图(图片来源于网络)

0.jpg

为了充沛的运用 CPU,操作系统会运用局部性原理,将高频的数据从内存中加载的缓存中,然后加快 CPU 的处理速度。

4.2、广义局部性

其实咱们的局部性原理不单单是上面说到的狭义性的局部性,还能够是广义的局部性。咱们系统里面的热门数据,CDN 数据,微博的热门流量等等这些都运用了局部性原理。仅仅咱们或许没有意识到而已,实际上已经在运用了。咱们会经过 Redis 缓存热门数据,会经过 CDN 提前加载图片或许视频资源,等等,都是因为这些数据本身就契合局部性原理,合理的运用局部性能够得到了能效、成本上的提升。

4.3、利害结合

任何事情都是多面性的,局部性原理尽管咱们运用起来很不错,能够前进系统性能,可是在有些场景下,咱们是需求避免局部性原理的出现的。或许说出现了这种状况,咱们需求人工处理。咱们能够试想一下,如果在咱们的一个大数据处理平台上,因为局部性原理的存在,导致咱们部分节点数据巨大运算费劲,部分节点数据量小非常空闲,这种状况自然是不合理,咱们就需求把数据依照事务场景进行重新分配,以到达整个集群的最大运用。

05、总结

今天给大家介绍了一下局部性原理,咱们说到了时刻局部性和空间局部性,经过一个代码示例和几个事务场景给大家简略介绍了局部性的运用。最后也说到局部性原理有利也有弊,咱们需求依据事务场景和需求合理话的运用。

最后欢迎大家到咱们《Java 极客技术》知识星球中来跟咱们一起学习,一起前进。