在雙層循環中應該盡量保證內循環的次數小於外循環的次數還是恰恰相反?

在雙層循環中應該盡量保證內循環的次數小於外循環的次數還是恰恰相反?就是那個效率高一些,尤其是當計算的數據量很大的時候?


需要用雙層循環的原因是業務需要雙層循環 所以不在性能上考慮什麼(就算考慮也是在被遍歷的元素上考慮此事 如何充分利用cacheline之類的)


看訪存連續性吧,通常是保證內層循環訪問的內存地址盡量連續(同樣適用於多層循環),這樣可以降低cache miss次數從而達到加速的效果。BLAS做乘法的時候都利用這個方法來優化cache。

不考慮存儲器層級的話倒是沒什麼區別了。


總的來說並沒有什麼區別


如果沒有優化到cache級別,那麼無所謂,如果有需要的話,盡量保證內層數據可以單次完全載入,重複利用。

內層還是外層大,沒有定論,看具體實現。

具體可以參見一些矩陣乘法的實現,通過分塊乘法可以提高cache命中率(load進cache的小塊可以反覆連續使用,減少cache和memory之間的換入換出),加速大矩陣乘法速度,本人測試可以達到8倍左右(機器渣,cache小=_=)。

這裡是內層大還是外層大呢?都不是,是加了一層循環=_=,跑題了......


看時間連續性和空間連續性。在csapp里有介紹。關鍵是看寄存器和緩存的命中率。


外循環跳轉距離大些,這裡有個cache line的問題。一般出了嵌入式設備不需要注意這個。對於pc而言二維數組外循環行內循環列影響會很大,內外循環次數影響可忽略不計


單次內循環的時間複雜度?空間複雜度?

具體情況具體分析


推薦閱讀:

C 中 int a[] 和 int*a 有什麼區別?
C語言編譯器是如何實現指針+1這樣的一個機制?
為什麼很多人建議學C語言不用任何IDE,直接用編輯器和編譯器?
C 語言有哪些缺陷?
int i=0,j; for(j=3;i=j=0;i++,j++)循環多少次?

TAG:演算法 | Java | C編程語言 |