首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

數組訪問性能差異深度解析:a[i][j] vs a[j][i] 的緩存命中率之爭

     編輯:關於C

實測數據震撼

訪問模式耗時相對性能
a[i][j](行優先)94秒基準 1.0x
a[j][i](列優先)488秒慢 5.2x

測試代碼:三層循環10000次遍歷MAX×MAX數組,僅內層賦值語句不同。

彙編代碼對比

GCC生成彙編僅4條指令不同(寄存器分配差異),指令級性能無本質區別。性能懸殊源於內存訪問模式。

CPU緩存機制深度解析

行優先存儲(C語言默認)

二維數組在內存中按行連續存放:a[0][0], a[0][1], ..., a[0][n-1], a[1][0], ...

緩存行填充

  • CPU讀取內存時,以緩存行(通常64字節)為單位載入L1緩存
  • 一次載入包含多個連續數組元素

訪問模式對比

模式內存訪問緩存行利用命中率
a[i][j] 內層遍歷列連續地址一行載入服務多次訪問極高
a[j][i] 內層遍歷行間隔n×sizeof(int)字節每次訪問觸發新緩存行載入極低

優化指導原則

  1. 順序訪問原則:多維數組內層循環走連續維度(C語言最後一維)
  2. 循環交換:將長循環內移、短循環外移,減少循環開銷
  3. 分支預測友好:減少熱路徑條件判斷,提高CPU分支預測命中率
  4. 預取優化:關鍵熱點可用__builtin_prefetch手動預取

驗證方法

使用perf stat -e cache-misses,cache-references量化緩存未命中率,指導優化方向。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved