我懷疑一些人在C++軟件開發(fā)人員身上進(jìn)行秘密的巴甫洛夫試驗,否則為什么當(dāng)提到“效率”這個詞時,許多程序員都會流口水。(Scott Meyers真幽默 譯者注)
事實上,效率可不是一個開玩笑的事情。一個太大或太慢的程序它們的優(yōu)點無論多么引人注目都不會為人們所接受。本來就應(yīng)該這樣。軟件是用來幫助我們更好地工作,說運行速度慢才是更好的,說需要32MB內(nèi)存的程序比僅僅需要16MB內(nèi)存的程序好,說占用100MB磁盤空間的程序比僅僅占用50MB磁盤空間的程序好,這簡直是無稽之談。而且盡管有一些程序確是為了進(jìn)行更復(fù)雜的運算才占用更多的時間和空間,但是對于許多程序來說只能歸咎于其糟糕的設(shè)計和馬虎的編程。
在用C++寫出高效地程序之前,必須認(rèn)識到C++本身絕對與你所遇到的任何性能上的問題無關(guān)。如果想寫出一個高效的C++程序,你必須首先能寫出一個高效的程序。太多的開發(fā)人員都忽視了這個簡單的道理。是的,循環(huán)能夠被手工展開,移位操作(shift operation)能夠替換乘法,但是如果你所使用的高層算法其內(nèi)在效率很低,這些微調(diào)就不會有任何作用。當(dāng)線性算法可用時你是否還用二次方程式算法?你是否一遍又一遍地計算重復(fù)的數(shù)值?如果是的話,可以毫不夸張地把你的程序比喻成一個二流的觀光勝地,即如果你有額外的時間,才值得去看一看。
本章的內(nèi)容從兩個角度闡述效率的問題。第一是從語言獨立的角度,關(guān)注那些你能在任何語言里都能使用的東西。C++為它們提供了特別吸引人的實現(xiàn)途徑,因為它對封裝的支持非常好,從而能夠用更好的算法與數(shù)據(jù)結(jié)構(gòu)來替代低效的類實現(xiàn),同時接口可以保持不變。
第二是關(guān)注C++語言本身。高性能的算法與數(shù)據(jù)結(jié)構(gòu)雖然非常好,但如果實際編程中代碼實現(xiàn)得很粗糙,效率也會降低得相當(dāng)多。潛在危害性的錯誤是既容易犯又不容易察覺的錯誤,瀕繁地構(gòu)造和釋放大量的對象就是一種這樣的錯誤。過多的對象構(gòu)造和對象釋放對于你的程序性能來說就象是在大出血,在每次建立和釋放不需要的對象的過程中,寶貴的時間就這么流走了。這個問題在C++程序中很普遍,我將用四個條款來說明這些對象從哪里來的,在不影響程序代碼正確性的基礎(chǔ)上如何消除它們。
建立大量的對象不會使程序變大而只會使其運行速度變慢。還有其它一些影響性能提高的因素,包括程序庫的選擇和語言特性的實現(xiàn)(implementations of language features)。在下面的條款中我也將涉及。
在學(xué)習(xí)了本章內(nèi)容以后,你將熟悉能夠提高程序性能的幾個原則,這些原則可以適用于你所寫的任何程序。你將知道如何準(zhǔn)確地防止在你的軟件里出現(xiàn)不需要的對象,并且對編譯器生成可執(zhí)行代碼的行為有著敏銳的感覺。
俗話說有備無患(forewarned is forearmed)。所以把下面的內(nèi)容想成是戰(zhàn)斗前的準(zhǔn)備。
事實上,效率可不是一個開玩笑的事情。一個太大或太慢的程序它們的優(yōu)點無論多么引人注目都不會為人們所接受。本來就應(yīng)該這樣。軟件是用來幫助我們更好地工作,說運行速度慢才是更好的,說需要32MB內(nèi)存的程序比僅僅需要16MB內(nèi)存的程序好,說占用100MB磁盤空間的程序比僅僅占用50MB磁盤空間的程序好,這簡直是無稽之談。而且盡管有一些程序確是為了進(jìn)行更復(fù)雜的運算才占用更多的時間和空間,但是對于許多程序來說只能歸咎于其糟糕的設(shè)計和馬虎的編程。
在用C++寫出高效地程序之前,必須認(rèn)識到C++本身絕對與你所遇到的任何性能上的問題無關(guān)。如果想寫出一個高效的C++程序,你必須首先能寫出一個高效的程序。太多的開發(fā)人員都忽視了這個簡單的道理。是的,循環(huán)能夠被手工展開,移位操作(shift operation)能夠替換乘法,但是如果你所使用的高層算法其內(nèi)在效率很低,這些微調(diào)就不會有任何作用。當(dāng)線性算法可用時你是否還用二次方程式算法?你是否一遍又一遍地計算重復(fù)的數(shù)值?如果是的話,可以毫不夸張地把你的程序比喻成一個二流的觀光勝地,即如果你有額外的時間,才值得去看一看。
本章的內(nèi)容從兩個角度闡述效率的問題。第一是從語言獨立的角度,關(guān)注那些你能在任何語言里都能使用的東西。C++為它們提供了特別吸引人的實現(xiàn)途徑,因為它對封裝的支持非常好,從而能夠用更好的算法與數(shù)據(jù)結(jié)構(gòu)來替代低效的類實現(xiàn),同時接口可以保持不變。
第二是關(guān)注C++語言本身。高性能的算法與數(shù)據(jù)結(jié)構(gòu)雖然非常好,但如果實際編程中代碼實現(xiàn)得很粗糙,效率也會降低得相當(dāng)多。潛在危害性的錯誤是既容易犯又不容易察覺的錯誤,瀕繁地構(gòu)造和釋放大量的對象就是一種這樣的錯誤。過多的對象構(gòu)造和對象釋放對于你的程序性能來說就象是在大出血,在每次建立和釋放不需要的對象的過程中,寶貴的時間就這么流走了。這個問題在C++程序中很普遍,我將用四個條款來說明這些對象從哪里來的,在不影響程序代碼正確性的基礎(chǔ)上如何消除它們。
建立大量的對象不會使程序變大而只會使其運行速度變慢。還有其它一些影響性能提高的因素,包括程序庫的選擇和語言特性的實現(xiàn)(implementations of language features)。在下面的條款中我也將涉及。
在學(xué)習(xí)了本章內(nèi)容以后,你將熟悉能夠提高程序性能的幾個原則,這些原則可以適用于你所寫的任何程序。你將知道如何準(zhǔn)確地防止在你的軟件里出現(xiàn)不需要的對象,并且對編譯器生成可執(zhí)行代碼的行為有著敏銳的感覺。
俗話說有備無患(forewarned is forearmed)。所以把下面的內(nèi)容想成是戰(zhàn)斗前的準(zhǔn)備。

