首頁 > 後端開發 > C++ > 為什麼循環 8192 個元素的陣列會突然減慢我的程式速度?

為什麼循環 8192 個元素的陣列會突然減慢我的程式速度?

DDD
發布: 2024-12-17 04:47:25
原創
259 人瀏覽過

Why Does Looping Over an 8192-Element Array Suddenly Slow Down My Program?

為什麼程式在循環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的值,如其執行所示次數:

  • 大小 = 8191:3.44 秒
  • 大小 = 8192:7.20 秒
  • 大小 = 8193:3.18秒

了解問題

執行時間的差異可以歸因於一個稱為超級對齊的已知問題:

  • 當SIZE 是2048 的倍數時(即, 8192 在本例中),以特定模式存取元素會觸發效率較低的記憶體佈局。

記憶體管理

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;
        }
    }
登入後複製

效能改善

互換外層循環後,效能顯著提升:

  • SIZE = 8191: 0.376 秒
  • SIZE = 8192: 0.357 秒
  • 大小 = 8193: 0.351 秒

以上是為什麼循環 8192 個元素的陣列會突然減慢我的程式速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板