程式效能優化 區域性性原理

2022-07-23 08:15:18 字數 1353 閱讀 9397

### 概念

乙個編寫良好的電腦程式常常具有良好的區域性性,它們傾向於引用最近引用過的資料項附近的資料項,或者最近引用過的資料項本身,這種傾向性,被稱為區域性性原理。有良好區域性性的程式比區域性性差的程式執行得更快。

### 區域性性通常有兩種不同的形式:

* 時間區域性性:在乙個具有良好時間區域性性的程式中,被引用過一次的記憶體位置很可能在不遠的將來被多次引用。

* 空間區域性性 :在乙個具有良好空間區域性性的程式中,如果乙個記憶體位置被引用了一次,那麼程式很可能在不遠的將來引用附近的乙個記憶體位置。

時間區域性性示例

```function sum(arry)

return sum

}```

在這個例子中,變數sum在每次迴圈迭代中被引用一次,因此,對於sum來說,具有良好的時間區域性性

空間區域性性示例

**具有良好空間區域性性的程式**

```// 二維陣列

function sum1(arry, rows, cols)

}return sum

}```

**空間區域性性差的程式**

```// 二維陣列

function sum2(arry, rows, cols)

}return sum

}```

看一下上面的兩個空間區域性性示例,像示例中從每行開始按順序訪問陣列每個元素的方式,稱為具有步長為1的引用模式。

如果在陣列中,每隔k個元素進行訪問,就稱為步長為k的引用模式。

一般而言,隨著步長的增加,空間區域性性下降。

這兩個例子有什麼區別?區別在於第乙個示例是按行掃瞄陣列,每掃瞄完一行再去掃下一行;第二個示例是按列來掃瞄陣列,掃完一行中的乙個元素,馬上就去掃下一行中的同一列元素。

陣列在記憶體中是按照行順序來存放的,結果就是逐行掃瞄陣列的示例得到了步長為 1 引用模式,具有良好的空間區域性性;而另乙個示例步長為 rows,空間區域性性極差。

### 效能測試

**執行環境:**

* cpu: i5-7400

* 瀏覽器: chrome 70.0.3538.110

對乙個長度為9000的二維陣列(子陣列長度也為9000)進行10次空間區域性性測試,時間(毫秒)取平均值,結果如下:

所用示例為上述兩個空間區域性性示例

|步長為 1|步長為 9000|

|-|-|

|124|2316|

從以上測試結果來看,步長為 1 的陣列執行時間比步長為 9000 的陣列快了乙個數量級。

### 總結:

* 重複引用相同變數的程式具有良好的時間區域性性

* 對於具有步長為 k 的引用模式的程式,步長越小,空間區域性性越好;而在記憶體中以大步長跳來跳去的程式空間區域性性會很差

程式效能優化 區域性性原理

乙個編寫良好的電腦程式常常具有良好的區域性性,它們傾向於引用最近引用過的資料項附近的資料項,或者最近引用過的資料項本身,這種傾向性,被稱為區域性性原理。有良好區域性性的程式比區域性性差的程式執行得更快。時間區域性性示例 function sum arry return sum 在這個例子中,變數su...

程式區域性性原理感悟

區域性性原理 程式的區域性性原理是指程式在執行時呈現出區域性性規律,即在一段時間內,整個程式的執行僅限於程式中的某一部分。相應地,執行所訪問的儲存空間也侷限於某個記憶體區域。區域性性原理又表現為 時間區域性性和空間區域性性。時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行...

區域性性原理

區域性性原理 cpu訪問 儲存器時,無論是訪問指令還是訪問資料,所訪問的 儲存單元 都趨於聚集在乙個較小的連續區域中。三種不同型別的區域性性 時間區域性性 temporal locality 如果乙個資訊項正在被訪問,那麼在近期它很可能還會被再次訪問。程式迴圈 堆疊等是產生時間區域性性的原因。順序區...