什么是程序的局部性原理
01、前言
作為有尋求的程序員,咱們日常在寫代碼的時分往往都會運用很多奇技淫巧,不單單是為了炫耀咱們的技術,更是為了尋求更高的功率。了解局部性原理,能夠有效的協(xié)助咱們理解和寫出更好的代碼,關于局部性原理或許有的小伙伴知道,有的小伙伴不知道,知道的小伙伴就當做溫習知識點,不知道的小伙伴也不要緊,接著往下看就知道了。
02、什么是局部性原理
說到局部性原理,那咱們首要要知道什么是局部性原理,局部性原理分為兩部分:
- 時刻局部性:指的是在程序運轉過程中最近被引用到的存儲器方位在程序履行后期還會被屢次引用到的或許性很大。
 - 空間局部性:指的是程序運轉過程中如果一個存儲器的方位被引用,那么在程序履行后期該存儲器附近的方位被引用的或許性很大。
 
簡略來說便是一個變量在程序運轉過程中,如果被引用過一次,那后續(xù)很有或許會再被引用到;一個變量被拜訪到過后,這個變量地點的方位附近的方位很有或許在程序后續(xù)運轉中被拜訪到。
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 在每次循環(huán)中都會用到,別的它僅僅一個簡略變量,所以咱們能夠看到,sum 是契合咱們上面說到的時刻局部性,再拜訪一次后還會被持續(xù)拜訪到,可是它不存在咱們所說的空間局部性了。
相反的,array 數組中的每個元素只拜訪一次,別的數組底層的存儲是連續(xù)的,所以 array 變量契合咱們上面說到的空間局部性,可是不契合時刻局部性。
這僅僅局部性原理的簡略示例,關于局部性原理還有很多地方會用到,咱們如果能熟練的把握和運用,對咱們的協(xié)助會很大的。
04、相關應用
4.1、CPU 緩存
上面的示例其實很簡略,信任大家都能理解,別的局部性原理其實在咱們日常運用的軟件中隨處可見,并且在操作系統(tǒng)中也少不了。咱們知道 CPU 的速度是非??斓?,而且 CPU 與內存之間有多級緩存,如下圖(圖片來源于網絡)
	
為了充沛的運用 CPU,操作系統(tǒng)會運用局部性原理,將高頻的數據從內存中加載的緩存中,然后加快 CPU 的處理速度。
4.2、廣義局部性
其實咱們的局部性原理不單單是上面說到的狹義性的局部性,還能夠是廣義的局部性。咱們系統(tǒng)里面的熱門數據,CDN 數據,微博的熱門流量等等這些都運用了局部性原理。僅僅咱們或許沒有意識到而已,實際上已經在運用了。咱們會經過 Redis 緩存熱門數據,會經過 CDN 提前加載圖片或許視頻資源,等等,都是因為這些數據本身就契合局部性原理,合理的運用局部性能夠得到了能效、成本上的提升。
4.3、利害結合
任何事情都是多面性的,局部性原理盡管咱們運用起來很不錯,能夠前進系統(tǒng)性能,可是在有些場景下,咱們是需求避免局部性原理的出現的?;蛟S說出現了這種狀況,咱們需求人工處理。咱們能夠試想一下,如果在咱們的一個大數據處理平臺上,因為局部性原理的存在,導致咱們部分節(jié)點數據巨大運算費勁,部分節(jié)點數據量小非??臻e,這種狀況自然是不合理,咱們就需求把數據依照事務場景進行重新分配,以到達整個集群的最大運用。
05、總結
今天給大家介紹了一下局部性原理,咱們說到了時刻局部性和空間局部性,經過一個代碼示例和幾個事務場景給大家簡略介紹了局部性的運用。最后也說到局部性原理有利也有弊,咱們需求依據事務場景和需求合理話的運用。
最后歡迎大家到咱們《Java 極客技術》知識星球中來跟咱們一起學習,一起前進。
