什么是程序的局部性原理
01、前言
作為有尋求的程序員,咱們?nèi)粘T趯懘a的時(shí)分往往都會(huì)運(yùn)用很多奇技淫巧,不單單是為了炫耀咱們的技術(shù),更是為了尋求更高的功率。了解局部性原理,能夠有效的協(xié)助咱們理解和寫出更好的代碼,關(guān)于局部性原理或許有的小伙伴知道,有的小伙伴不知道,知道的小伙伴就當(dāng)做溫習(xí)知識(shí)點(diǎn),不知道的小伙伴也不要緊,接著往下看就知道了。
02、什么是局部性原理
說到局部性原理,那咱們首要要知道什么是局部性原理,局部性原理分為兩部分:
- 時(shí)刻局部性:指的是在程序運(yùn)轉(zhuǎn)過程中最近被引用到的存儲(chǔ)器方位在程序履行后期還會(huì)被屢次引用到的或許性很大。
- 空間局部性:指的是程序運(yùn)轉(zhuǎn)過程中如果一個(gè)存儲(chǔ)器的方位被引用,那么在程序履行后期該存儲(chǔ)器附近的方位被引用的或許性很大。
簡(jiǎn)略來說便是一個(gè)變量在程序運(yùn)轉(zhuǎn)過程中,如果被引用過一次,那后續(xù)很有或許會(huì)再被引用到;一個(gè)變量被拜訪到過后,這個(gè)變量地點(diǎn)的方位附近的方位很有或許在程序后續(xù)運(yùn)轉(zhuǎn)中被拜訪到。
03、示例
上面是經(jīng)過理論來說明的,下面咱們經(jīng)過一段代碼來看看局部性y原理
public int sum(int[] array) { int sum = 0; for (int i = 0; i < array.length; i++) { sum = sum + array[i]; } return sum; }
從上面的這段代碼來看,便是一個(gè)很簡(jiǎn)略的數(shù)組元素求和,這兒咱們主要看 sum 和 array 兩個(gè)變量,咱們能夠看到 sum 在每次循環(huán)中都會(huì)用到,別的它僅僅一個(gè)簡(jiǎn)略變量,所以咱們能夠看到,sum 是契合咱們上面說到的時(shí)刻局部性,再拜訪一次后還會(huì)被持續(xù)拜訪到,可是它不存在咱們所說的空間局部性了。
相反的,array 數(shù)組中的每個(gè)元素只拜訪一次,別的數(shù)組底層的存儲(chǔ)是連續(xù)的,所以 array 變量契合咱們上面說到的空間局部性,可是不契合時(shí)刻局部性。
這僅僅局部性原理的簡(jiǎn)略示例,關(guān)于局部性原理還有很多地方會(huì)用到,咱們?nèi)绻苁炀毜陌盐蘸瓦\(yùn)用,對(duì)咱們的協(xié)助會(huì)很大的。
04、相關(guān)應(yīng)用
4.1、CPU 緩存
上面的示例其實(shí)很簡(jiǎn)略,信任大家都能理解,別的局部性原理其實(shí)在咱們?nèi)粘_\(yùn)用的軟件中隨處可見,并且在操作系統(tǒng)中也少不了。咱們知道 CPU 的速度是非??斓?,而且 CPU 與內(nèi)存之間有多級(jí)緩存,如下圖(圖片來源于網(wǎng)絡(luò))
為了充沛的運(yùn)用 CPU,操作系統(tǒng)會(huì)運(yùn)用局部性原理,將高頻的數(shù)據(jù)從內(nèi)存中加載的緩存中,然后加快 CPU 的處理速度。
4.2、廣義局部性
其實(shí)咱們的局部性原理不單單是上面說到的狹義性的局部性,還能夠是廣義的局部性。咱們系統(tǒng)里面的熱門數(shù)據(jù),CDN 數(shù)據(jù),微博的熱門流量等等這些都運(yùn)用了局部性原理。僅僅咱們或許沒有意識(shí)到而已,實(shí)際上已經(jīng)在運(yùn)用了。咱們會(huì)經(jīng)過 Redis 緩存熱門數(shù)據(jù),會(huì)經(jīng)過 CDN 提前加載圖片或許視頻資源,等等,都是因?yàn)檫@些數(shù)據(jù)本身就契合局部性原理,合理的運(yùn)用局部性能夠得到了能效、成本上的提升。
4.3、利害結(jié)合
任何事情都是多面性的,局部性原理盡管咱們運(yùn)用起來很不錯(cuò),能夠前進(jìn)系統(tǒng)性能,可是在有些場(chǎng)景下,咱們是需求避免局部性原理的出現(xiàn)的?;蛟S說出現(xiàn)了這種狀況,咱們需求人工處理。咱們能夠試想一下,如果在咱們的一個(gè)大數(shù)據(jù)處理平臺(tái)上,因?yàn)榫植啃栽淼拇嬖?,?dǎo)致咱們部分節(jié)點(diǎn)數(shù)據(jù)巨大運(yùn)算費(fèi)勁,部分節(jié)點(diǎn)數(shù)據(jù)量小非常空閑,這種狀況自然是不合理,咱們就需求把數(shù)據(jù)依照事務(wù)場(chǎng)景進(jìn)行重新分配,以到達(dá)整個(gè)集群的最大運(yùn)用。
05、總結(jié)
今天給大家介紹了一下局部性原理,咱們說到了時(shí)刻局部性和空間局部性,經(jīng)過一個(gè)代碼示例和幾個(gè)事務(wù)場(chǎng)景給大家簡(jiǎn)略介紹了局部性的運(yùn)用。最后也說到局部性原理有利也有弊,咱們需求依據(jù)事務(wù)場(chǎng)景和需求合理話的運(yùn)用。
最后歡迎大家到咱們《Java 極客技術(shù)》知識(shí)星球中來跟咱們一起學(xué)習(xí),一起前進(jìn)。