官术网_书友最值得收藏!

1.3 效率優(yōu)先

在1.1節(jié)中,我們介紹了性能是由準確率、速度和效率構(gòu)成的。筆者在書中提到過,當談到效率時,首先指的是資源的高效利用,但同時也包括代碼的運行速度(延遲)。如何看待代碼在生產(chǎn)環(huán)境的運行情況,這里有一個實用的方法。

秘訣就是不要關(guān)注代碼的速度和延遲。一般來說,對于非專業(yè)化的軟件來說,速度是無關(guān)緊要的,資源的浪費和不必要的消耗才是導致速度變慢的主要原因。而且,為了追求高的速度而犧牲效率的做法總是弊大于利。因此,我們應該更多地關(guān)注效率。然而令人遺憾的是,人們往往忽視了這一點。

假設(shè)你想從城市A到城市B,途中必須穿越一條河,你可以選擇一輛快車,開車駛過附近的橋到達城市B。但如果你直接跳進河里,慢慢游過河,那么你會更快到達城市B。在選擇更短的路線時,雖然慢一些,但效率更高。可能有人會說,為了提高行車效率,我們可以買一輛更快的車,改善路況以減少阻力,甚至加裝火箭發(fā)動機。這的確有可能比游泳過去更快,但花費的成本也高到無法估算。

軟件領(lǐng)域也有類似的情況。比如,利用某個算法搜索存儲在磁盤上的某些單詞,執(zhí)行速度異常緩慢。你可能很快就會想到,應該使用SSD而不是HDD。換成SSD后,搜索速度可以提升10倍,這是增加速度的最直接方式。但是,如果能找到一種方法來增強當前的算法,使其能夠更快尋址到單詞,就能實現(xiàn)更低的延遲。這表明,我們完全可以通過不增加成本的方式來獲得相同甚至更好的效果。

筆者建議應該把更多的精力集中在效率上,而不是單純地集中在執(zhí)行速度上。這也是這本書的英文版為什么叫“Efficient Go”,而不是一些更吸引眼球的名稱[33],比如“Ultra Performance Go”或者“Fastest Go Implementations”。

雖然筆者更關(guān)注效率,但并不是說速度不重要。本書將在第3章中介紹速度與效率的聯(lián)系。有時候需要對它們做出權(quán)衡,因為兩者可能相互影響。我們在實踐中經(jīng)常會看到,程序在主流程上做的工作越少,延遲就越低。在HDD與SDD的示例中,將HDD替換為SSD時,也可以通過把之前的那些緩存邏輯刪掉來提高效率(這能使用更少的內(nèi)存和CPU時間)。此外,前面講的另一種方法也能提高效率——正如1.2.3節(jié)所述,程序運行得越快,能耗就越低,從而可以提升能效。

筆者認為,應該把提高效率放在提升速度之前,這是提高性能的第一步。正如10.2節(jié)所述,只有提高效率,才能做到僅用一個CPU內(nèi)核就將延遲降低為原來的七分之一。你可能會感到驚訝,有時在提高效率后,延遲也達到了預期效果!下面就來了解效率更加優(yōu)先的一些原因:

很難讓高效的軟件變慢

可讀性好的代碼更容易優(yōu)化,這一點與“效率高的代碼通常執(zhí)行得更好”的事實相似。在實踐中,效率低下的軟件往往性能也較差。代碼的運行效率直接影響到軟件的整體性能。

速度更加“脆弱”

本書將在7.3節(jié)中說明,軟件的延遲取決于大量的外部因素。在獨立的環(huán)境中,人們可能會有針對性地做些優(yōu)化,但如果長時間運行,速度就會變慢。在某些情況下,CPU可能會由于服務器的散熱問題而受到限制。其他進程(例如,定期備份)可能會讓應用軟件的速度慢得驚人。此外,網(wǎng)絡問題也時常發(fā)生。當我們僅僅為了確保執(zhí)行速度而編程時,往往需要考慮很多隱藏的未知因素。這就是為什么效率通常是我們程序員最能掌控的。

速度不是通用概念

如果只針對速度進行優(yōu)化,那么當應用程序從開發(fā)人員的機器部署到服務器或各種客戶端時,就不一定具備最初的運行速度。不同的硬件、環(huán)境和操作系統(tǒng)都可以改變應用程序的速度與延遲。這也是效率優(yōu)先的又一個原因。首先,效率幾乎不依賴外部環(huán)境。其次,效率在任何平臺都是通用的。

一般來說,效率和可讀性是設(shè)計軟件之初就應該考慮的問題。擁有良好的效率意識,對軟件的健壯性有正向作用,能避免在后期開發(fā)階段遭遇難以彌補的愚蠢的性能錯誤。另外,盡可能地精簡代碼,對提高代碼的可維護性和可擴展性也有幫助。

主站蜘蛛池模板: 聊城市| 夏津县| 通榆县| 哈尔滨市| 岳池县| 衡阳县| 中方县| 瓮安县| 四子王旗| 仙桃市| 蒙自县| 三江| 赤峰市| 永定县| 高碑店市| 凉城县| 五寨县| 高雄市| 阳山县| 遂昌县| 临高县| 田林县| 光泽县| 岳普湖县| 仁寿县| 盖州市| 天等县| 庄河市| 资中县| 彰武县| 新野县| 聂荣县| 常州市| 望奎县| 双流县| 当阳市| 合川市| 突泉县| 南靖县| 珠海市| 宜州市|