• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

            學(xué)海苦作舟,書山勤為徑

            留下點(diǎn)回憶

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            Denoise

            English study

            Web技術(shù)

            數(shù)據(jù)壓縮

            一些連接

            最新評(píng)論

            代碼優(yōu)化-刪除分支(實(shí)例1)

             

            分支是什么,具體可以參見:http://blog.csdn.net/housisong/archive/2007/10/05/1812117.aspx

            這里舉一個(gè)實(shí)際的例子來說明如何刪除分支。

            代碼如下:

             

             1#define DIVIDE_BY(a,b) ((a < b)? (a = 0):(a /= b))
             2
             3short CXpegDCT::Quant(long val,long div)
             4
             5{
             6
             7         if (val < 0{
             8
             9                   val = -val + (div>>1);/* for rounding */
            10
            11                   DIVIDE_BY(val, div);
            12
            13                   val = -val;
            14
            15         }
             else {
            16
            17                   val += div>>1/* for rounding */
            18
            19                   DIVIDE_BY(val, div);
            20
            21         }

            22
            23         return (short)val;
            24
            25}

            26
            27


            上面的代碼有兩個(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ù)值,修改后的代碼如下:

             

             1Long m_TmpVals[2];
             2
             3short CXpegDCT::Quant(long val,long div)
             4
             5{
             6
             7         long lTmpVal;
             8
             9         m_TmpVals[0= val;
            10
            11         m_TmpVals[1= -val;
            12
            13         lTmpVal = m_TmpVals[val<0];
            14
            15 
            16
            17         lTmpVal += (div>>1);/* for rounding */
            18
            19         DIVIDE_BY(lTmpVal, div);
            20
            21         m_TmpVals[0= lTmpVal;
            22
            23         m_TmpVals[1= -lTmpVal;
            24
            25         return (short)m_TmpVals[val<0];
            26
            27}

            28

             

             

            先要定義一個(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ù)除法。例如:

             

            Long m_TmpVals[2];

            Long m_TmpVals2[
            2];

            short CXpegDCT::Quant(long val,long div)

            {

                     
            long lTmpVal;

                     m_TmpVals[
            0= val;

                     m_TmpVals[
            1= -val;

                     lTmpVal 
            = m_TmpVals[val<0];

             

                     lTmpVal 
            += (div>>1);/* for rounding */

                     m_TmpVals2[
            1= 0;

                     m_TmpVals2[
            0= lTmpVal/div;

                     m_TmpVals[
            0= m_TmpVals2[lTmpVal<div];

                     m_TmpVals[
            1= - m_TmpVals2[lTmpVal<div];

                     
            return (short)m_TmpVals[val<0];

            }

            如上面的代碼,雖然刪除了分支,但卻帶來了一個(gè)必須的除法運(yùn)算,所以這個(gè)分出刪除未必是合適的。

            posted on 2008-09-29 00:00 笨笨 閱讀(1869) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 代碼優(yōu)化

            久久九九青青国产精品| 99久久精品国产一区二区蜜芽| 女人高潮久久久叫人喷水| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区| 精品久久久久久无码人妻热| 久久人人爽人人人人片av| 国内精品久久久久久久97牛牛 | 日本亚洲色大成网站WWW久久| 精品国产乱码久久久久久呢| 国产成人精品久久综合| 18岁日韩内射颜射午夜久久成人| 91精品国产高清久久久久久91| 国色天香久久久久久久小说| 久久久久久久国产免费看| 久久精品中文字幕无码绿巨人 | 久久国产精品久久国产精品| 国产成人精品三上悠亚久久| 久久久久一本毛久久久| 91久久精品电影| 久久久精品2019免费观看| 伊人久久大香线焦AV综合影院| 久久精品无码一区二区三区免费 | 久久综合久久综合九色| 囯产极品美女高潮无套久久久 | 国产亚洲欧美成人久久片| 久久婷婷五月综合97色| 久久99久久99精品免视看动漫| 理论片午午伦夜理片久久| 久久99亚洲综合精品首页| 国产—久久香蕉国产线看观看| 亚洲国产精品久久久久网站| 97久久天天综合色天天综合色hd| 久久精品国产精品亚洲毛片| 热re99久久6国产精品免费| 一本色道久久HEZYO无码| 无码AV中文字幕久久专区| 久久久久国产精品嫩草影院| 国内高清久久久久久| 少妇高潮惨叫久久久久久 | 久久久久亚洲精品天堂| 久久国产精品成人片免费|