看很多關(guān)于代碼優(yōu)化的資料,都說代碼優(yōu)化是必要的,但是應(yīng)該推遲到項(xiàng)目的最后階段進(jìn)行。原因很多:
1) 過早的優(yōu)化容易引入bug,一個(gè)慢但是bug-free的程序總比快但是總crash的程序好;
2) 當(dāng)今硬件性能今非昔比。不過對一個(gè)在PC上運(yùn)行的程序可以說只能在XXX主頻以上的機(jī)器上才能運(yùn)行,但是在某些項(xiàng)目中,比如手機(jī),硬件環(huán)境是fixed的,只能優(yōu)化代碼來遷就CPU了。
3) 在迭代開發(fā)中,現(xiàn)階段的優(yōu)化下一個(gè)階段會被打破,還不如不優(yōu)化,省得浪費(fèi)。
不過還是有幾點(diǎn)優(yōu)化策略可以邊開發(fā)邊實(shí)施,這幾點(diǎn)也算是程序員的基本功:
1) 函數(shù)聲明中復(fù)雜類參數(shù)為傳遞引用而不是傳值,這樣可以避免調(diào)用函數(shù)時(shí)的copy?。悖铮睿螅簦颍酰悖簦铮虻恼{(diào)用,
void?。妫铮?SomeClass?。??。椋睿簟。?;
可以優(yōu)化為
void?。妫铮?const?。樱铮恚澹茫欤幔螅蟆?amp;x,?。椋睿簟。?;
對primitive類型(int,?。妫欤铮幔??。洌铮酰猓欤宓龋暶鳛橐脹]有什么意義。
2) 變量直到使用時(shí)才創(chuàng)建,和C語言不多,一個(gè)函數(shù)體內(nèi)用到的變量,沒有必要在函數(shù)體開始聲明,所以C++代碼中應(yīng)該養(yǎng)成用一個(gè)變量時(shí)才聲明的習(xí)慣; 但是,如果一個(gè)對象在一個(gè)循環(huán)中被使用,最好還是在循環(huán)之外聲明初始化它,以免被反復(fù)初始化。
for (....)
{
SomeClass?。铮猓?
....
}
可優(yōu)化為
SomeClass obj;
for (...)
{
...;
}
3) 初始化和聲明同時(shí)進(jìn)行。
SomeClass?。铮猓? //?。洌澹妫幔酰欤簟。悖铮睿螅簦颍酰悖簦铮颉。椋蟆。悖幔欤欤澹?br>obj = xyz; //?。铮穑澹颍幔簦铮颉??。椋蟆。悖幔欤欤澹?br>優(yōu)化為
SomeClass?。铮猓辍? ?。? //only?。悖铮穑。悖铮睿螅簦颍酰悖簦铮颉。椋蟆。悖幔欤欤澹?br>
4) 在構(gòu)造函數(shù)中使用初始化list
SomeClass::SomeClass(int?。?
{
?。妫铮铩??。?
}
優(yōu)化為
SomeClass::SomeClass(int?。?
:?。妫铮?x)
{
}
5) 使用+=,避免用+。
Foo?。妫铮铮??。妫铮铮?
foo1 =?。妫铮铮薄? foo2;
優(yōu)化為
Foo?。妫铮铮??。妫铮铮?
foo1 +=?。妫铮铮?
可以避免一個(gè)臨時(shí)變量的產(chǎn)生,如果Foo為一個(gè)復(fù)雜類的話,效果明顯。
6) 使用++x,避免用x++
和上面一條一樣,可以避免出現(xiàn)零時(shí)變量。
我還聽說copy constructor效率比operator = 高,我做了一個(gè)實(shí)驗(yàn),循環(huán)666666666次,在P4 2.8G的機(jī)器上,只有一個(gè)int成員的簡單類copy?。悖铮睿螅簦颍酰悖铮簦铮?qū)嶋H上比operator =還慢一秒,我想這兩個(gè)形式的overhead差別很小,而且和編譯器有關(guān),可以忽略不計(jì)。
http://www.tantalon.com/pete/cppopt/main.htm上有一個(gè)C++代碼從設(shè)計(jì)到編譯器優(yōu)化的介紹,很系統(tǒng)。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=379496