• <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 在線詞典, 英語學(xué)習(xí), 在線翻譯

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

            留下點(diǎn)回憶

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            Denoise

            English study

            Web技術(shù)

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

            一些連接

            最新評(píng)論

            一段代碼的幾種寫法-怎么樣寫好的代碼

             

            程序員當(dāng)然要說代碼了,代碼是程序員的一切,離了代碼說其他都是假的,我這里從一段代碼開始。

             

                int c=0, n=0,nDiff=0;
                
            int height = m_imgHeight;//image height
                LPBYTE lpDsp 
            = pSampling;
                jp2_int16 
            *sp, val;
                LPBYTE dest;
                
            //m_imgWidth-image width

                nDiff 
            = m_lineBytes - m_imgWidth*3;
                
            while (height--) {
                    
            for (c=0; c<THREE_COMPONENT; c++) {
                        dest 
            = lpDsp+c;
                        sp 
            = m_lines[c].m_pBuf;
                        
            for (n=m_imgWidth; n>0; n--, sp++, dest+=THREE_COMPONENT) {
                            
            *sp += 2;//virtual option
                                ……
                            
            *dest = *sp;
                        }
                    }

                    
            /*
                    
            If the bytes isn't 4-bytes multiple, 1-3 bytes will not be 
                    initialized. So these bytes should be initialized as 0
                    
            */
                    
            if(nDiff){
                        dest 
            -= 2;
                        
            for(n = nDiff;n>0;n--){
                            
            *dest = 0;
                            dest
            ++;
                        }
                    }

                    lpDsp 
            += m_lineBytes;
                }

             

            這段代碼的目的是一個(gè)與圖形相關(guān)的操作,這里省略了許多代碼,所以不可能編譯;其基本的含義是從一個(gè)緩沖區(qū)復(fù)制到目標(biāo)緩沖區(qū)pSampling。其中m_imgWidthm_imgHeight表示圖象的寬度和高度,m_lineBytes表示4個(gè)字節(jié)對(duì)齊的一行像素的字節(jié)數(shù)。

            我們知道BMP文件的像素要求每行的最終字節(jié)數(shù)必須是4個(gè)倍數(shù)。如果圖象寬度是4的倍數(shù),不用仇是沒有問題的;如果不是4的倍數(shù),例如:129,而且每個(gè)像素一個(gè)字節(jié),那么最終存儲(chǔ)的長度是132個(gè)字節(jié),但后面的幾個(gè)字節(jié)如果不填充是未知的內(nèi)容。上面if(nDiff){后面的就是為了填充這些多余的字節(jié)。

            我的一個(gè)朋友認(rèn)為這樣寫更有效一點(diǎn):

             

                        dest -= 2;
                        
            for(n = nDiff;n>0;n--){
                            
            *dest = 0;
                            dest
            ++;
                        }

            他的分析是:如果66%的機(jī)會(huì)nDiff不是0,這個(gè)代碼效率更高。

            來看一下兩種寫法的不同:

            第一種寫法是:不管3721,都判斷一下;如果nDiff不為0,需要至少3個(gè)指令:判斷//判斷。

            第二種寫法是:不判斷,先減,然后通過for循環(huán)來判斷。對(duì)于nDiff0不為0,都是兩個(gè)指令:減/判斷。

            但如果多余66%的機(jī)會(huì)(比如70%)nDiff不為0,第一種寫法需要的平均指令數(shù)為:

            70%*3+30%*1 = 2.4

            第二種寫法的平均指令數(shù)為:

            70%*2+30%*2 = 2

            可見第二種寫法的好處可以體現(xiàn)在:

            1. 代碼簡潔

            2. 效率更高

             

            但我發(fā)現(xiàn)代碼中很少的機(jī)會(huì)nDiff不為0,這位老兄又立刻想到了另一種寫法:

              

                    if(nDiff){
                        dest 
            -= 2;
                        
            do{
                            
            *dest = 0;
                            dest
            ++;
                        } 
            while(nDiff--);
                    }

            再來看一下這種寫法的特點(diǎn),假設(shè)30%的機(jī)會(huì)nDiff不為0

            原來寫法的指令數(shù)為:

            70%*1+30%*3 = 1.6

            上面寫法的指令數(shù)為:

            70%*1+30%*2 = 1.3

            因?yàn)榈谝淮尾恍枰袛啵划?dāng)然后面的循環(huán)都是一樣的。

             

            從這件事情的本身我們甚至可以說是吹毛求茨,而從效率上來說這個(gè)代碼提高的并不是很多。但我想說的不是這些,而是故事說明的寫這個(gè)代碼的時(shí)候作者在想些什么,我想至少是這樣的:

            1. 寫出簡潔的代碼。第二種寫法明顯簡潔。

            2. 寫出最高效的代碼,即使是CPU很快的今天。如果上面的代碼在一個(gè)循環(huán)的內(nèi)部,效率高低很快就體現(xiàn)出來。

            3. 深入的思考和比較。計(jì)算條件成立的概率,至少應(yīng)該對(duì)代碼在什么情況下運(yùn)行很了解。


            4. 寫好代碼的精神。

            posted on 2007-07-06 12:44 笨笨 閱讀(1981) 評(píng)論(11)  編輯 收藏 引用 所屬分類: 編碼

            評(píng)論

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 15:47 SuperPlayeR

            不講效率的話,memset(dest, 0, nDiff);也可以

            恕我直言,我個(gè)人認(rèn)為在這樣的小地方求效率的提高,不如把代碼寫的更容易讓人看懂。《Unix編程藝術(shù)》中似乎有對(duì)于這種“優(yōu)化”做過探討,我比較贊成書中作者的觀點(diǎn)。  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 16:11 SmartPtr

            我有兩點(diǎn)想法, 一是在性能不是關(guān)鍵因素的程序中代碼的可讀性重于效率;二是代碼效率優(yōu)化應(yīng)該針對(duì)關(guān)鍵的瓶頸。 當(dāng)然, 博主的一些思路也是值得討論的  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 17:32 夏夏

            怎麼辦,一點(diǎn)點(diǎn)都看不懂~~~  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 21:22 AlanTop

            *dest = 0;
            dest++;

            上面這兩行代碼,可以寫成

            *dest++ = 0;

              回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 21:41 笨笨

            @SuperPlayeR
            你說的很對(duì),如果不講效率代碼寫的容易懂是關(guān)鍵.但簡潔的代碼也是讓人懂的一個(gè)方面.另外實(shí)際上我在討論的時(shí)候也很關(guān)注效率的問題.
              回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 21:41 笨笨

            @AlanTop
            很好,你的這種做法很正確.  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 22:10 sy555

            你說的很對(duì),
            -------------------------------------------------
            http://www.sy555.com  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼[未登錄] 2007-07-06 22:11 QQ

            <p><a href="/"";http://www.qq128.net/">QQ信息網(wǎng)</a></p>  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-06 22:54 pass86

            支持第二種。  回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-09 22:46 Jerry.Yu

            why not initialize dest buffer at the beginning, such as using
            memset(...) ? If I am right, the size of dest buffer can be work out the beginning.
            ...

            also, the code segment like
            for(n ... ; n++) can be write as for(n....; ++n) .. would be better for compiler....



              回復(fù)  更多評(píng)論   

            # re: 一段代碼的幾種寫法-怎么樣寫好的代碼 2007-07-10 09:01 笨笨

            @Jerry.Yu
            memset is high price if you just set several bytes as zero, so from performancd view, memset isn't always good.

            You don't understand the problem really yet. The write style just to avoid two check condition words
              回復(fù)  更多評(píng)論   

            日韩亚洲欧美久久久www综合网 | 国产毛片欧美毛片久久久| 深夜久久AAAAA级毛片免费看| 亚洲国产成人精品女人久久久 | 99久久夜色精品国产网站| 久久久精品久久久久影院| 国产产无码乱码精品久久鸭| 精品久久久久久无码人妻热| 伊人久久精品无码av一区| 久久精品二区| 精品久久8x国产免费观看| 中文字幕亚洲综合久久菠萝蜜| 国产精品美女久久久久网| 久久亚洲春色中文字幕久久久| 久久精品成人一区二区三区| 亚洲乱亚洲乱淫久久| 久久久老熟女一区二区三区| 国产精品亚洲综合久久 | 久久久久久国产a免费观看不卡| 性欧美丰满熟妇XXXX性久久久| 久久精品无码一区二区三区日韩| 99久久成人国产精品免费| 久久精品国产网红主播| 国产成年无码久久久免费| 亚洲第一极品精品无码久久| 久久综合九色欧美综合狠狠| 狠狠人妻久久久久久综合蜜桃| 99久久99久久久精品齐齐| 狠狠久久亚洲欧美专区| 国内精品久久久久久野外| 久久精品国产亚洲欧美| 伊人久久大香线焦综合四虎| 国产精品天天影视久久综合网| 99久久久精品免费观看国产| 久久久久久国产精品无码超碰| 97精品依人久久久大香线蕉97| 无码国产69精品久久久久网站| 久久久国产精品亚洲一区| 久久99精品综合国产首页| 热99RE久久精品这里都是精品免费 | 久久精品国产色蜜蜜麻豆|