為什麼在循環 8192 個元素時效能會下降
循環 8192 個元素時,程式會遇到明顯的減速。這是由於記憶體對齊問題造成的,低效率的循環結構加劇了這個問題。
記憶體對齊
現代處理器利用快取層次結構來提高資料存取速度。對齊的記憶體存取(其中資料儲存在快取行大小的倍數的位址處)允許更快的資料檢索。但是,在本例中,SIZE 參數定義為 8192,它不是快取行大小(通常為 64 位元組)的倍數。這種不對齊會減慢記憶體存取操作。
循環排序
循環的排序使記憶體對齊問題更加複雜。原始程式碼按列迭代矩陣,導致非順序記憶體存取。這迫使處理器以較慢的速度從記憶體中隨機檢索資料。
解
有兩種可能的解決方案:
透過交換程式碼中的循環順序,消除了效能瓶頸。
範例
以下程式碼說明了修正:
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中文網其他相關文章!