2012年10月14日 星期日

[Development] Loop Unrolling (unwinding)

寫程式時,有個基本的 loop unrolling,白話說,就是將迴圈內容展開。請看以下例子 (例子是 wiki的):
  1. 
     int x;
     for (x = 0; x < 100; x++)
     {
         delete(x);
     }
    
  2. 
    
    
     int x; 
     for (x = 0; x < 100; x+=5)
     {
         delete(x);
         delete(x+1);
         delete(x+2);
         delete(x+3);
         delete(x+4);
     }
    
以上兩個方法目的相同,對於可讀性來說,第一個方法明顯好讀很多,第二個則是 unrolling後的結果。簡單說,loop unrolling的概念就是在每回 (iteration) 中,多做幾次運算,而減少 iteration次數。因為每次 iteration就是一次 branch,以上例來說,判斷次數就差了 5倍,對於效能上是有很大的差異的。不過一般建議,寫程式還是以第一個方法為主,等最後要 tune效能再考慮 loop unrolling,這邊只是為了 "看懂" 為什麼別人要這麼寫!

Ref:

沒有留言:

張貼留言