2009年9月16日 星期三

有一個for迴圈,從0加到100 可是我覺得他不夠快,要怎樣才能讓他更快

for( i=0; i<=100; i++) s=s+i;

不可以用數學公式 請忽略宣告或初始化的問題

以下是其中幾位工程師的看法:


Leadgen:
Firmware 是介於不軟和不硬間,必需知道你所對待的硬體的能力和軟體的需求。
思考點: 1.減少loop overhead I: unrolling II: algorithm
2.充分利用硬體特性 I:加減1有特殊硬體 II:和0比較有特殊硬體

for(i=100;i>=0;i--)
s += i;

這個會比你上面還快。 配合unrolling,會更快。
Key: 請想一下上面的code怎麼翻成組合語言? 為什麼要寫成遞減?


MasterChang

int i=100;
int result=0;

while(i)
{
result+=i--;
}

這類問題通常是考連加問題,因為連加的物件不見得是0~100,有
可能是連續位址的值。C語言用while loop 去做數值遞減(ex:組語
的dec reg),並檢查C旗標或Z旗標等變化編譯的組語命令在一循環
下,會比單一用遞增命令(ex:組語inc reg)去檢查是否為某一值少
。因為檢查某一值常編譯出來是減去其值是否為零驗證,否而需要
較多的組語命令。

所以這類問題的解法通常要從組語觀念著手探討,考官要考您有無
這類觀念,但學校通常「不會教」。