留下點(diǎn)回憶
分支是什么,具體可以參見:http://blog.csdn.net/housisong/archive/2007/10/05/1812117.aspx
這里舉一個(gè)實(shí)際的例子來說明如何刪除分支。
代碼如下:
上面的代碼有兩個(gè)分支;一個(gè)是用來判斷val的值是否大于0,另外一個(gè)是判斷val是否比被除數(shù)小。
對(duì)于第一個(gè)判斷的目的就是要在val小于0的時(shí)候?qū)⑵滢D(zhuǎn)換為正值,然后進(jìn)行除法運(yùn)算,最終還要將符號(hào)取反。因此對(duì)于val為正和負(fù)的不同在于運(yùn)算前后的符號(hào)取反。
為了消除這個(gè)分支需要定義一個(gè)數(shù)組,這個(gè)數(shù)組包含兩個(gè)元素;一個(gè)元素保存正val的絕對(duì)值,另外一個(gè)保存絕對(duì)值的負(fù)值,修改后的代碼如下:
先要定義一個(gè)數(shù)組,然后在開始的時(shí)候給這個(gè)數(shù)組賦值,進(jìn)行除法以后,同樣將結(jié)果賦值數(shù)組,在對(duì)數(shù)組取值的時(shí)候使用val<0作為索引來查找。上面的程序與前面的程序是等價(jià)的。但它卻消除了分支,從而讓CPU能更好的預(yù)測(cè)。
其實(shí)對(duì)于除法的也是一個(gè)分支,在開始的時(shí)候我試圖也消除這個(gè)分支,但結(jié)果事與愿為,我的轉(zhuǎn)換確實(shí)消除了分支,帶來的確實(shí)無能如何都要執(zhí)行一次整數(shù)除法。例如:
posted on 2008-09-29 00:00 笨笨 閱讀(1869) 評(píng)論(0) 編輯 收藏 引用 所屬分類: 代碼優(yōu)化
Powered by: C++博客 Copyright © 笨笨