青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Dict.CN 在線詞典, 英語學習, 在線翻譯

學海苦作舟,書山勤為徑

留下點回憶

常用鏈接

統計

積分與排名

Denoise

English study

Web技術

數據壓縮

一些連接

最新評論

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

 

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

 

    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;
    }

 

這段代碼的目的是一個與圖形相關的操作,這里省略了許多代碼,所以不可能編譯;其基本的含義是從一個緩沖區復制到目標緩沖區pSampling。其中m_imgWidthm_imgHeight表示圖象的寬度和高度,m_lineBytes表示4個字節對齊的一行像素的字節數。

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

我的一個朋友認為這樣寫更有效一點:

 

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

他的分析是:如果66%的機會nDiff不是0,這個代碼效率更高。

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

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

第二種寫法是:不判斷,先減,然后通過for循環來判斷。對于nDiff0不為0,都是兩個指令:減/判斷。

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

70%*3+30%*1 = 2.4

第二種寫法的平均指令數為:

70%*2+30%*2 = 2

可見第二種寫法的好處可以體現在:

1. 代碼簡潔

2. 效率更高

 

但我發現代碼中很少的機會nDiff不為0,這位老兄又立刻想到了另一種寫法:

  

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

再來看一下這種寫法的特點,假設30%的機會nDiff不為0

原來寫法的指令數為:

70%*1+30%*3 = 1.6

上面寫法的指令數為:

70%*1+30%*2 = 1.3

因為第一次不需要判斷;當然后面的循環都是一樣的。

 

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

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

2. 寫出最高效的代碼,即使是CPU很快的今天。如果上面的代碼在一個循環的內部,效率高低很快就體現出來。

3. 深入的思考和比較。計算條件成立的概率,至少應該對代碼在什么情況下運行很了解。


4. 寫好代碼的精神。

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

評論

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

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

恕我直言,我個人認為在這樣的小地方求效率的提高,不如把代碼寫的更容易讓人看懂?!禪nix編程藝術》中似乎有對于這種“優化”做過探討,我比較贊成書中作者的觀點。  回復  更多評論   

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

我有兩點想法, 一是在性能不是關鍵因素的程序中代碼的可讀性重于效率;二是代碼效率優化應該針對關鍵的瓶頸。 當然, 博主的一些思路也是值得討論的  回復  更多評論   

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

怎麼辦,一點點都看不懂~~~  回復  更多評論   

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

*dest = 0;
dest++;

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

*dest++ = 0;

  回復  更多評論   

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

@SuperPlayeR
你說的很對,如果不講效率代碼寫的容易懂是關鍵.但簡潔的代碼也是讓人懂的一個方面.另外實際上我在討論的時候也很關注效率的問題.
  回復  更多評論   

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

@AlanTop
很好,你的這種做法很正確.  回復  更多評論   

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

你說的很對,
-------------------------------------------------
http://www.sy555.com  回復  更多評論   

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

<p><a href="/"";http://www.qq128.net/">QQ信息網</a></p>  回復  更多評論   

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

支持第二種。  回復  更多評論   

# 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....



  回復  更多評論   

# 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
  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            99国产精品自拍| 99国内精品久久| 久久婷婷国产麻豆91天堂| 亚洲欧美久久久久一区二区三区| 一区二区三区日韩| 亚洲综合视频一区| 久久本道综合色狠狠五月| 久久精品国产久精国产爱| 免费观看成人网| 欧美日韩免费看| 国产精品亚洲美女av网站| 国内精品模特av私拍在线观看| 国产在线高清精品| 亚洲精品永久免费| 香蕉免费一区二区三区在线观看 | 久久精品国产精品亚洲综合 | 亚洲精品国产精品国产自| 一区二区三区|亚洲午夜| 欧美在线视频免费| 欧美激情第五页| 亚洲午夜成aⅴ人片| 久久久久国内| 国产精品久久婷婷六月丁香| 国产自产高清不卡| 亚洲性感美女99在线| 久久蜜桃资源一区二区老牛| 亚洲免费福利视频| 免费观看久久久4p| 国产日韩综合| 亚洲一区三区视频在线观看| 欧美成ee人免费视频| 在线视频欧美日韩| 欧美精品播放| 最新高清无码专区| 久久综合中文字幕| 欧美一区二区视频免费观看| 国产精品白丝av嫩草影院| 亚洲国内精品在线| 蜜桃精品久久久久久久免费影院| 亚洲一区二区毛片| 欧美日韩久久久久久| 亚洲国语精品自产拍在线观看| 欧美在线播放| 亚洲免费视频网站| 国产精品美女主播| 西瓜成人精品人成网站| 日韩午夜在线播放| 欧美jizz19hd性欧美| 一区二区不卡在线视频 午夜欧美不卡'| 免费在线成人av| 欧美在现视频| 国产欧美1区2区3区| 亚洲小视频在线观看| 亚洲裸体视频| 欧美视频网站| 亚洲视频免费观看| 一区二区不卡在线视频 午夜欧美不卡在| 久热精品在线视频| 亚洲第一综合天堂另类专| 久久综合色8888| 久热精品在线视频| 亚洲精品美女久久7777777| 欧美大片免费久久精品三p| 久久在精品线影院精品国产| 亚洲电影观看| 91久久亚洲| 欧美日韩黄色大片| 亚洲欧美另类在线观看| 亚洲综合日韩在线| 韩国一区二区在线观看| 美脚丝袜一区二区三区在线观看| 久久九九热re6这里有精品| 在线不卡a资源高清| 欧美不卡一卡二卡免费版| 欧美伦理91| 久久精品一区二区| 麻豆国产精品va在线观看不卡| 亚洲人www| 亚洲午夜免费视频| 精品999久久久| 亚洲精品一区二区三区av| 国产精品免费一区二区三区在线观看 | 国产欧美日韩不卡| 久久久久免费| 欧美va亚洲va日韩∨a综合色| 亚洲人成网站777色婷婷| 日韩香蕉视频| 国产在线不卡| 日韩视频免费观看高清完整版| 国产精品美女xx| 免费观看成人| 国产精品视频免费观看| 亚洲第一在线| 国产一区在线播放| 亚洲美女免费精品视频在线观看| 国产精品一区久久| 亚洲国产日韩一级| 国产性天天综合网| 亚洲乱码国产乱码精品精天堂| 国产精品一区二区久久精品| 欧美大色视频| 国产女精品视频网站免费| 亚洲高清免费视频| 狠狠爱www人成狠狠爱综合网| 亚洲精品乱码久久久久久按摩观| 国产在线精品自拍| 亚洲视频狠狠| 久久国产视频网| 亚洲大片一区二区三区| 在线一区二区日韩| 亚洲欧洲视频| 久久国产精品高清| 午夜伦理片一区| 欧美日韩在线高清| 亚洲成色www久久网站| 狠狠干综合网| 亚洲欧美日韩另类精品一区二区三区 | 久久字幕精品一区| 国产精品捆绑调教| 91久久国产综合久久| 在线观看不卡av| 欧美一区二区视频观看视频| 亚洲女性喷水在线观看一区| 欧美黄色小视频| 欧美激情一区二区| 亚洲电影网站| 久久九九热re6这里有精品| 久久精品国产免费看久久精品| 国产精品劲爆视频| 一区二区三区高清在线| 亚洲午夜国产成人av电影男同| 欧美激情第六页| 91久久国产综合久久蜜月精品 | 久久久91精品国产| 国产欧美在线看| 午夜精品视频在线观看| 欧美在线影院| 国内外成人免费激情在线视频网站| 亚洲欧美日韩国产一区| 久久成人人人人精品欧| 国产亚洲亚洲| 老鸭窝亚洲一区二区三区| 欧美国产在线电影| 亚洲二区三区四区| 欧美夫妇交换俱乐部在线观看| 91久久精品国产91久久性色| 亚洲精品在线二区| 欧美午夜精品久久久久久超碰| 99视频在线观看一区三区| 亚洲午夜久久久久久久久电影院| 欧美日韩在线免费视频| 亚洲永久免费视频| 久热re这里精品视频在线6| 亚洲欧洲精品一区二区三区不卡 | 国产精品vip| 西西人体一区二区| 欧美jizzhd精品欧美巨大免费| 亚洲精品社区| 国产精品日韩在线观看| 久久亚洲私人国产精品va| 亚洲欧洲在线一区| 午夜精品福利电影| 韩国免费一区| 欧美日韩成人网| 午夜精品在线视频| 亚洲电影天堂av| 久久精品成人欧美大片古装| 亚洲国产va精品久久久不卡综合| 欧美在线一二三| 亚洲伊人伊色伊影伊综合网| 欧美理论在线| 欧美在线视频观看| 亚洲国产成人精品女人久久久| 亚洲在线成人精品| 亚洲成人在线| 国产美女精品在线| 欧美韩国日本综合| 久久大逼视频| 99re这里只有精品6| 久久日韩粉嫩一区二区三区| 亚洲毛片播放| 国产综合视频| 国产精品久久久久久久9999 | 国产精品精品视频| 免播放器亚洲| 欧美亚洲在线| 亚洲视频在线一区| 亚洲人成人一区二区在线观看| 久久久久久国产精品mv| 亚洲视频网在线直播| 亚洲国产欧美一区二区三区久久| 国产精品一区二区三区久久久| 欧美精品在线一区二区| 久久一区二区视频| 久久精品99国产精品| 亚洲欧美日韩在线| 亚洲一区三区视频在线观看 | 一区二区三区免费观看| 亚洲国产黄色| 亚洲第一综合天堂另类专|