局部性原理淺析——良好代碼的基本素質(zhì)(轉(zhuǎn)載)

開篇


一個(gè)優(yōu)秀的程序、優(yōu)美的代碼,一般都具有良好的局部性。簡(jiǎn)潔、高效是每個(gè)程序員的追求。了解程序的局部性,能編寫出更高效的代碼。


因?yàn)橛辛己镁植啃缘某绦蚰芨玫睦镁彺?。不過這方面的只是將在以后的文章中介紹。


這篇文章就簡(jiǎn)單的介紹以下程序的局部性原理。


什么是局部性


局部性通常有兩種形式:


時(shí)間局部性(temporal locality)


時(shí)間局部性指的是:被引用過一次的存儲(chǔ)器位置在未來會(huì)被多次引用(通常在循環(huán)中)。


空間局部性(spatial locality)


如果一個(gè)存儲(chǔ)器的位置被引用,那么將來他附近的位置也會(huì)被引用。


(這樣說過于理論了些,在下面的論述中會(huì)有例子說明)


數(shù)據(jù)引用局部性




例子是最好說明問題的途徑~

圖片發(fā)自簡(jiǎn)書App


看圖a)中的 for 循環(huán),可以判斷:循環(huán)中的 sum 有良好的時(shí)間局部性。因?yàn)樵趂or循環(huán)結(jié)束之前,每次執(zhí)行循環(huán)體都有對(duì) sum 的訪問。


而 sum 沒有空間局部性。因?yàn)閟um 是標(biāo)量(也就是說通過 sum 這個(gè)地址(可認(rèn)為是基址,只能得到一個(gè)值)


對(duì)于循環(huán)體中的 v 則有良好的空間局部性??梢钥吹?圖 b) 中,向量 v 是按順序存儲(chǔ)的(在實(shí)際中多數(shù)情況也按順序存儲(chǔ))。


每次訪問 v[i]總是在 v[i-1] 的下一個(gè)位置。而 v 沒有時(shí)間局部性。因?yàn)槊總€(gè)元素只被訪問一次。


步長(zhǎng)


向上面例子中按順序、連續(xù)的對(duì) v 的引用,我們稱為步長(zhǎng)為1的引用模式。同理,在一個(gè)連續(xù)的向量中,每隔k個(gè)元素對(duì)向量進(jìn)行訪問,稱為步長(zhǎng)為k的引用。一般來說,隨著步長(zhǎng)的增加,空間局部性會(huì)下降。


對(duì)于多維數(shù)組而言,步長(zhǎng)對(duì)空間局部性的影響顯得尤為重要。


圖片發(fā)自簡(jiǎn)書App



考慮上面的例子,是對(duì)一個(gè)二維數(shù)組的求和。


可以看到,for循環(huán)體中,是以行序?yàn)橹餍驅(qū)υ剡M(jìn)行遍歷。也就是說內(nèi)層循環(huán)先訪問第一行的元素,然后第二行。。。


圖 b)中是二維數(shù)組存儲(chǔ)情況??梢钥闯?,在存儲(chǔ)器中也是按照行序?yàn)橹餍騺磉M(jìn)行存儲(chǔ)的。也就是說先存儲(chǔ)第一行,然后第二行。。。


現(xiàn)在我們已經(jīng)知道了,本例中存儲(chǔ)順序和訪問順序一致。所以可以該程序?qū)[][]的引用有良好的空間局部性。


對(duì)a[][]實(shí)行的是步長(zhǎng)為1 的引用。


繼續(xù)看下面的例子:

圖片發(fā)自簡(jiǎn)書App




可以看出,相對(duì)于上面的例子,該例的for 循環(huán)中交換了 索引 i j 的位置。


也就是說在對(duì)a[][]進(jìn)行遍歷的時(shí)候,以列序?yàn)橹餍?。即先訪問第一列,在訪問第二列。。。


而b)中,對(duì)a[][]的存儲(chǔ)仍是行序?yàn)橹餍?。這意味著沒訪問一個(gè)元素,就要跳過k個(gè)存儲(chǔ)器才能訪問下一個(gè)。于是得到一個(gè)簡(jiǎn)單的結(jié)論:該例中對(duì)a[][]的訪問是以步長(zhǎng)為k 的模式(k 為每行的元素個(gè)數(shù))沒有良好的時(shí)間局部性。


通過上面的例子我們知道:在對(duì)向量的訪問中,如果訪問數(shù)序和存儲(chǔ)順序一致,并且是連續(xù)訪問,那么這種訪問具有良好的空間局部性。


取指令的局部性


指令存在于存儲(chǔ)器中,cpu 要讀指令就必須取出指令。所以也能評(píng)價(jià)對(duì)于取指令的局部性。


在for 循環(huán)中,循環(huán)體內(nèi)的指令多次被執(zhí)行,所以有良好的時(shí)間局部性。


循環(huán)體中的指令是桉順序執(zhí)行的,有良好的空間局部性(指令在存儲(chǔ)器中是順序存放的)。


局部性小結(jié)


評(píng)價(jià)局部性的簡(jiǎn)單原則:


1、重復(fù)引用同一個(gè)變量有良好的時(shí)間局部性


2、對(duì)于步長(zhǎng)為k 的引用的程序,步長(zhǎng)越小,空間局部性越小。步長(zhǎng)為1 的引用具有良好的空間局部性。k越大,空間局部性越差。


3、對(duì)于取指令來說、循環(huán)有較好的時(shí)間和空間局部性。


后記


這篇文章只是簡(jiǎn)單的介紹了什么是局部性,局部性原理的應(yīng)有,即為什么有良好局部性的程序有更好的性能,局部性和告訴緩存的關(guān)系是如何的,將在后面的文章中介紹。這篇文章且當(dāng)作后文的鋪墊吧。


本人認(rèn)知有限,如上述文章有不足之處歡迎指正交流。



參看資料:computer systems


如有轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/yanlingyin/


一條魚、yanlingyin@ 博客園 2012-2-11


E-mail:yanlingyin@yeah.net

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容