對於迴圈次數較為有限的for迴圈,可通過手工展開該迴圈達到消除此迴圈的目的,達到加速執行的目的,下面給出乙個**段例項。
1、for迴圈體
1//q為常數
2for ( k = 0; k < q; k++)
6 }
此段**由兩重迴圈構成,q為常數,嘗試將內層迴圈展開來消除內層迴圈。
2、記憶體迴圈展開
1for ( k = 0; k < q; k++)
展開內層迴圈,將兩重迴圈變為一重迴圈。
3、對比
展開前,**執行時間為66s,展開後,執行時間51s,執行時間縮短22.7%,執行加速效果還是非常顯著,考慮到此段**為整個程式的執行熱點段,對整個程式執行也將帶來一定的速度提公升。
如上所述,展開內層迴圈已經有了顯著的加速效果,進一步展開外層迴圈,不知是否能進一步加速**,減少執行時間,有待進一步驗證。
java 高效能計算 展開迴圈
size medium 可以優化的地方實在是太多了,只要你願意去想,去嘗試。如下 size package 高效能 public class 展開迴圈 system.out.println 未展開 last time system.currenttimemillis begin long begin...
迴圈展開技術
迴圈一直令我們頭疼,因為迴圈體內總是隱藏著熱點!看一段示例 for i 0 i 10 i 觀察迴圈體彙編 我們很容易發現,由於迴圈體的內容相對簡單,以至於這個迴圈實際執行過程中差不多一半的指令都在為檢查迴圈執行的條件而服務。如果計算迴圈索引和測試迴圈條件的迴圈開銷部分所佔比重過大,這時就可以考慮使用...
Loop Unrolling 迴圈展開
以書中計算陣列和的兩段 為例 1.未展開 void psum1 float a,float p,long int n 2.展開 void psum2 float a,float p,long int n for odd n,finish remaining element if i n p i p ...