留下點回憶
程序員當然要說代碼了,代碼是程序員的一切,離了代碼說其他都是假的,我這里從一段代碼開始。
這段代碼的目的是一個與圖形相關的操作,這里省略了許多代碼,所以不可能編譯;其基本的含義是從一個緩沖區復制到目標緩沖區pSampling。其中m_imgWidth和m_imgHeight表示圖象的寬度和高度,m_lineBytes表示4個字節對齊的一行像素的字節數。
我們知道BMP文件的像素要求每行的最終字節數必須是4個倍數。如果圖象寬度是4的倍數,不用仇是沒有問題的;如果不是4的倍數,例如:129,而且每個像素一個字節,那么最終存儲的長度是132個字節,但后面的幾個字節如果不填充是未知的內容。上面if(nDiff){后面的就是為了填充這些多余的字節。
我的一個朋友認為這樣寫更有效一點:
他的分析是:如果66%的機會nDiff不是0,這個代碼效率更高。
來看一下兩種寫法的不同:
第一種寫法是:不管3721,都判斷一下;如果nDiff不為0,需要至少3個指令:判斷/減/判斷。
第二種寫法是:不判斷,先減,然后通過for循環來判斷。對于nDiff為0不為0,都是兩個指令:減/判斷。
但如果多余66%的機會(比如70%)nDiff不為0,第一種寫法需要的平均指令數為:
70%*3+30%*1 = 2.4
第二種寫法的平均指令數為:
70%*2+30%*2 = 2
可見第二種寫法的好處可以體現在:
1. 代碼簡潔
2. 效率更高
但我發現代碼中很少的機會nDiff不為0,這位老兄又立刻想到了另一種寫法:
再來看一下這種寫法的特點,假設30%的機會nDiff不為0:
原來寫法的指令數為:
70%*1+30%*3 = 1.6
上面寫法的指令數為:
70%*1+30%*2 = 1.3
因為第一次不需要判斷;當然后面的循環都是一樣的。
從這件事情的本身我們甚至可以說是吹毛求茨,而從效率上來說這個代碼提高的并不是很多。但我想說的不是這些,而是故事說明的寫這個代碼的時候作者在想些什么,我想至少是這樣的:
1. 寫出簡潔的代碼。第二種寫法明顯簡潔。
2. 寫出最高效的代碼,即使是CPU很快的今天。如果上面的代碼在一個循環的內部,效率高低很快就體現出來。
3. 深入的思考和比較。計算條件成立的概率,至少應該對代碼在什么情況下運行很了解。
posted on 2007-07-06 12:44 笨笨 閱讀(1971) 評論(11) 編輯 收藏 引用 所屬分類: 編碼
不講效率的話,memset(dest, 0, nDiff);也可以 恕我直言,我個人認為在這樣的小地方求效率的提高,不如把代碼寫的更容易讓人看懂。《Unix編程藝術》中似乎有對于這種“優化”做過探討,我比較贊成書中作者的觀點。 回復 更多評論
我有兩點想法, 一是在性能不是關鍵因素的程序中代碼的可讀性重于效率;二是代碼效率優化應該針對關鍵的瓶頸。 當然, 博主的一些思路也是值得討論的 回復 更多評論
怎麼辦,一點點都看不懂~~~ 回復 更多評論
*dest = 0; dest++; 上面這兩行代碼,可以寫成 *dest++ = 0; 回復 更多評論
@SuperPlayeR 你說的很對,如果不講效率代碼寫的容易懂是關鍵.但簡潔的代碼也是讓人懂的一個方面.另外實際上我在討論的時候也很關注效率的問題. 回復 更多評論
@AlanTop 很好,你的這種做法很正確. 回復 更多評論
你說的很對, ------------------------------------------------- http://www.sy555.com 回復 更多評論
<p><a href="/"";http://www.qq128.net/">QQ信息網</a></p> 回復 更多評論
支持第二種。 回復 更多評論
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.... 回復 更多評論
@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 回復 更多評論
Powered by: C++博客 Copyright © 笨笨