為什麼程式在循環8192 個元素時速度變慢
考慮以下程式碼片段:
#define SIZE 8192 float img[SIZE][SIZE]; // input image float res[SIZE][SIZE]; // result of mean filter int main() { // Initialization for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { img[j][i] = (2 * j + i) % 8196; } } // Matrix processing - applying mean filter for (int i = 1; i < SIZE - 1; i++) { for (int j = 1; j < SIZE - 1; j++) { res[j][i] = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { res[j][i] += img[j + l][i + k]; } } res[j][i] /= 9; } } }
此程式碼展示效能變化取決於SIZE的值,如其執行所示次數:
了解問題
執行時間的差異可以歸因於一個稱為超級對齊的已知問題:
記憶體管理
Malloc/free 不直接負責效能差異。
外循環排序
此程式碼中的另一個關鍵問題是外循環的順序。原始程式碼按列迭代矩陣,而按行迭代對於記憶體存取效率更高。
解
為了緩解效能問題,外層循環應互換:
for (int j = 1; j < SIZE - 1; j++) { for (int i = 1; i < SIZE - 1; i++) { res[j][i] = 0; for (int k = -1; k < 2; k++) { for (int l = -1; l < 2; l++) { res[j][i] += img[j + l][i + k]; } } res[j][i] /= 9; } }
效能改善
互換外層循環後,效能顯著提升:
以上是為什麼循環 8192 個元素的陣列會突然減慢我的程式速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!