首頁 >後端開發 >C++ >為什麼我的循環在處理 8192 個元素時很慢?

為什麼我的循環在處理 8192 個元素時很慢?

DDD
DDD原創
2024-12-10 09:51:10685瀏覽

Why is My Loop Slow When Processing 8192 Elements?

為什麼在循環 8192 個元素時效能會下降

循環 8192 個元素時,程式會遇到明顯的減速。這是由於記憶體對齊問題造成的,低效率的循環結構加劇了這個問題。

記憶體對齊

現代處理器利用快取層次結構來提高資料存取速度。對齊的記憶體存取(其中資料儲存在快取行大小的倍數的位址處)允許更快的資料檢索。但是,在本例中,SIZE 參數定義為 8192,它不是快取行大小(通常為 64 位元組)的倍數。這種不對齊會減慢記憶體存取操作。

循環排序

循環的排序使記憶體對齊問題更加複雜。原始程式碼按列迭代矩陣,導致非順序記憶體存取。這迫使處理器以較慢的速度從記憶體中隨機檢索資料。

有兩種可能的解決方案:

  1. 對齊記憶體:將SIZE 重新定義為快取行大小的倍數(例如8192 64).
  2. 交換循環排序:不是按列迭代,而是按行迭代矩陣。這使記憶體存取與快取行組織保持一致,從而實現更快、更有效率的資料檢索。

透過交換程式碼中的循環順序,消除了效能瓶頸。

範例

以下程式碼說明了修正:

for(j=1;j<SIZE-1;j++) {
    for(i=1;i<SIZE-1;i++) {
        res[j][i]=0;
        res[j][i] += img[j-1][i-1];
        ...
    }
}

效能對比

應用修復後,效能顯著提升:

原始碼:

SIZE = 8191: 1.499 seconds
SIZE = 8192: 2.122 seconds
SIZE = 8193: 1.582 seconds

固定程式碼:

SIZE = 8191: 0.376 seconds
SIZE = 8192: 0.357 seconds
SIZE = 8193: 0.351 seconds

以上是為什麼我的循環在處理 8192 個元素時很慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn