什麼是程序的局部性原理

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 與內存之間有多級緩存,如下圖(圖片來源於網絡)

image-20191129115010857.png

爲了充分的利用 CPU,操作系統會利用局部性原理,將高頻的數據從內存中加載的緩存中,從而加快 CPU 的處理速度。

4.2、廣義局部性

其實我們的局部性原理不單單是上面提到的狹義性的局部性,還可以是廣義的局部性。我們系統裏面的熱點數據,CDN 數據,微博的熱點流量等等這些都利用了局部性原理。只是我們可能沒有意識到而已,實際上已經在使用了。我們會通過 Redis 緩存熱點數據,會通過 CDN 提前加載圖片或者視頻資源,等等,都是因爲這些數據本身就符合局部性原理,合理的利用局部性可以得到了能效、成本上的提升。

4.3、利弊結合

任何事情都是多面性的,局部性原理雖然我們使用起來很不錯,可以提高系統性能,但是在有些場景下,我們是需要避免局部性原理的出現的。或者說出現了這種情況,我們需要人工處理。我們可以試想一下,如果在我們的一個大數據處理平臺上,由於局部性原理的存在,導致我們部分節點數據龐大運算吃力,部分節點數據量小十分空閒,這種情況自然是不合理,我們就需要把數據按照業務場景進行重新分配,以達到整個集羣的最大利用。

05、總結

今天給大家介紹了一下局部性原理,我們提到了時間局部性和空間局部性,通過一個代碼示例和幾個業務場景給大家簡單介紹了局部性的使用。最後也提到局部性原理有利也有弊,我們需要根據業務場景和需求合理話的使用。

發佈了265 篇原創文章 · 獲贊 361 · 訪問量 79萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章