2007/03/20

if, switch 怎麼讓成績等級的判斷最快?

有人不想用 if 來判斷成績等級,以為用 switch 會比較快。哦,對了,先說說問題:

假設要寫一個算學生成績的程式:
100~91 : A
90 ~81 : B
80 ~71 : C
...
10 ~ 0 : J

首先,就編譯器的眼光來看,我猜用十個 if 來寫應該是非常快的了。當然,要改成 if elseif 來寫當然會更有效率一點。這邊是指類似:
if (G <= 100 &&amp; G >= 91) g = 'A';
...
else if (G<= 10 &&amp; G>=0) g = 'J';


改成:

if (G >= 91) g = 'A';
else if (G >= 81) g = 'B';
...
else if (G >= 11) g = 'I';
else g = 'J';


上面假設成績最高 100, 最低 0

然而若要照原來那個朋友要的,改成 switch 的話,基本上,是可以做到,但是即使經過轉換改成 switch, 以編譯器的眼光來看,switch 是較慢的,最佳化也是類似上面的寫法。

不過底下提供另一個寫法,不保證較快,但是需要點腦袋來思考:
g = 9 - (int)((G-1)/10) + 65;

g = 74 - (int)((G-1)/10);

一個整數除法與兩個減法。或許可以跟 if 比效率吧!

另外,還有一個寫法,若純粹想要讓人頭昏的話還不錯用:

g = (110-G)/10 | 0x40;

這個的演化來自於 74 - x == 64 + (10-x) == (10-x) | 0x40
最後的答案是把 10 搬到分子,整數除法跟浮點除法不一樣,整數除法要看成「一段範圍」的除法取整數,因此搬到分子的時候是 109 而非 100, 這一點留給看官花點時間想想。

0 意見: