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

1.4 本章小結

筆者認為,軟件研發人員在開發過程中為了完成目標而做出妥協是很常見的,比如通過犧牲一些效率、可讀性、可測試性來保證按期交付。但在本章中,筆者建議開發人員對軟件質量要有苛刻的自我要求,堅持不要去犧牲任何關于質量的特性,除非萬不得已。對于有些繞不開的問題,只要稍加努力并借助適當的工具,也能妥善將其解決。

本章介紹了性能是由準確率、速度、效率構成的,以及業界對于性能問題的常見誤解。我們認識到了過早悲觀、過早優化、過早擴展帶來的結果。最后,在性能的優化過程中,我們了解到優先優化效率才是正確的方向。

在下一章中,筆者會介紹Go語言。在優化Go程序性能之前,必須對它有足夠的認知,不然一切都是紙上談兵。


[1]為了證明這一點,筆者甚至在Twitter上做了一個小實驗(https://oreil.ly/997J5)。

[2]劍橋詞典中對性能一詞的定義(https://oreil.ly/AXq4Q):一個人、機器等完成工作或活動的表現如何。

[3]筆者建議變更日志使用標準格式,可以參考https://oreil.ly/rADTI,該材料還包含如何清理release notes的寶貴建議。

[4]這里能使用“less performant”(低性能)嗎?不能,因為英語詞匯中不存在performant這個詞。這里也不能使用高低性能來形容軟件——因為軟件的性能總有提升的空間。從實際意義上講,軟件的速度總是有限的。H.J.Bremermann在1962年提出了一個概念:存在一個依賴于系統質量的計算次數物理極限(https://oreil.ly/1sl3f)。根據這個概念就可以進行估算,1kg重的高配筆記本計算機每秒大約可以處理1050bit,而地球質量大小的計算機每秒最多也就可以處理1075bit。雖然這些數字看起來異常大,但即使用如此大的計算機處理復雜性為10120的國際象棋也需要花費很長時間(https://oreil.ly/6qS1T)。這些數字在密碼學中有實際用途,可以用于評估破解某些加密算法的難度。

[5]值得一提的是,隱藏功能實現或優化細節可能會導致代碼可讀性降低。有時將它們呈現出來可以避免出現意外。

[6]最好在實現中注釋說明可能出現的問題,以確保代碼的穩定性和可靠性。

[7]Get方法的這三種實現方式的調用成本都很高。文件系統的I/O操作比從內存讀取或寫入內容要慢得多;涉及互斥鎖意味著需要等待調度;訪問數據庫兩者兼有,還涉及網絡通信。

[8]這句名言經常被用來勸退那些嘗試做優化工作的人,且經常被過度使用,它出自Donald Knuth的“Structured Programming with goto statements”(https://oreil.ly/m3P50)(1974)。

[9]這種變量風格通常被稱為匈牙利表示法,它在微軟公司中被廣泛使用。匈牙利表示法有兩種類型:匈牙利應用命名法(Apps Hungarian)和匈牙利系統命名法(Systems Hungarian)。有文獻表明,匈牙利應用命名法在軟件研發過程中可以帶來很多益處(https://oreil.ly/rYLX4)。

[10]在開發時建議妥善使用IDE的某些功能來編寫代碼,例如,使用某些IDE編寫出的代碼可以構成“連通圖”(connected graph)(https://oreil.ly/mFzH9)。這意味著借助IDE的功能可以方便地管理依賴關系。任何動態分派、代碼注入和延遲加載都會導致這些功能被禁用,除非有特殊需求,否則應該避免影響這些功能的正常使用。

[11]認知負荷是指人在學習或完成任務過程中進行信息加工所耗費的認知資源的總量(https://oreil.ly/5CJ9X)。

[12]可緩存性(Cachability)被定義(https://oreil.ly/WNaRz)為數據被緩存的能力。任何信息都可以被緩存(保存),以便后續更快地檢索。然而,緩存的數據可能只在短時間內有用,或者只對少量請求有用。那些依賴于外部因素(例如,用戶或者輸入)并且頻繁更改的數據,就不適合被加入緩存。

[13]實際上,Thanos可能占用了更多內存,因為內存剖析結果不會顯示內存映射、堆棧和操作系統緩存,第4章將介紹更多相關信息。

[14]西里爾·諾斯古德·帕金森(Cyril Northcote Parkinson)是一位英國歷史學家,他提出了“帕金森定律”,該定律指出:“工作增多只是為了填滿完成這項工作的時間”,作者試圖傳達的主要觀點是:隨著組織的發展,官僚主義也會擴大。

[15]其實筆者在學習時也是這樣,這種現象也被稱為“學生癥候群”(Student Syndrome)(https://oreil.ly/4Vpqb),又稱為“拖延癥”。

[16]PB指petabyte,1PB=1024TB。如果一部時長兩小時的4K電影占用100GB的磁盤空間,那么1PB的磁盤空間可以存儲1萬多部這樣的電影,要連續觀看兩年多才能看完。

[17]1ZB=1024×1024PB=1024×1024×1024TB。

[18]Robert H.Dennard et al.,“Design of Ion-Implanted MOSFET's with Very Small Physical Dimension”(https://oreil.ly/OAGPC),IEEE Journal of Solid-State Circuits 9,no.5(October 1974):256-268.

[19]MOSFET(https://oreil.ly/mhc5k)即“金屬-氧化物半導體場效應管”,被廣泛用于電流開關控制與信號放大。它被證明具有高度的可擴展性和微型化能力,是歷史上制造頻率最高的電子設備,其數量是個天文數字。

[20]有趣的是,考慮到市場營銷,芯片公司將CPU的命名規則從晶體管的柵極長度改為制程大小,以此來掩蓋不能有效地通過制程來減小晶體管尺寸的這一事實。例如,14nm工藝的CPU仍然使用70nm的晶體管,那些10nm、7nm和5nm工藝的CPU也都是這樣。

[21]筆者沒有開玩笑,微軟已經證實(https://oreil.ly/nJzkN),在水下40m處運行服務器是一個提高能源效率的絕佳方案。

[22]蘋果公司的M系列芯片(https://oreil.ly/emBke)不走尋常路,在速度、能效與硬件擴展靈活性之間選擇了速度與能效。

[23]RISC-V是開源指令集架構標準,RISC-V指令集可以自由地用于任何目的,允許任何人設計、制造和銷售RISC-V芯片和軟件。這種指令集非常簡單,能夠做出比通用CPU更專精的硬件。

[24]為了確保開發人員能夠理解那些網速較慢的用戶,Facebook推出了“2G Tuesdays”(https://oreil.ly/fZSoQ)活動,該活動會在Facebook應用程序上模擬2G網絡模式。

[25]在AWS上購買這樣的云實例其實并不貴,比如,實例類型x1e.32xlarge每小時收費26.6美元(https://oreil.ly/9fw5G),每月僅需支付19418美元。

[26]即使是硬件配置極高的機器,其管理方式也有所不同。這就是為什么Linux會有hugemem類型的內核,它可以更穩定地管理x86架構下的超大內存。

[27]CAP定理(https://oreil.ly/EYqPI)是一個分布式系統設計原則。其名稱由一致性(Consistency)、可用性(Availability)和分區容忍度(Partition tolerance)的首字母拼接而成,指的是在一個分布式系統中,這三個要素最多只能同時實現兩個,不可能三者兼顧。

[28]拒絕服務攻擊(Denial of Service,DoS)是一種使目標系統停止響應的攻擊手段,一般是因系統過載而被觸發。

[29]大約在2015年,它成為波蘭速度最快的超級計算機,運算速度能達到1.41PFlop/s,提供超過1600個節點,其中大部分節點配備了專用的GPU。

[30]無限帶寬(InfiniBand)是一種高性能的網絡通信標準,它在光纖通信發明之前非常流行。

[31]有趣的是,馬克·扎克伯格卻在2014年的F8大會上宣布將Facebook的口號改為“Move Fast with Stable infra”(快速行動,穩定基建)(https://oreil.ly/Yt2VI)。

[32]在云原生領域,有一個常見的案例是將日志從Elasticsearch遷移到更輕量級的組件,如Loki。盡管Loki缺乏可配置的索引,但它占用更少的資源,并提供更好的日志讀取性能。

[33]當然還有其他原因,“Efficient Go”這個名字非常接近于Go語言領域的最佳文檔“Effective Go”(https://oreil.ly/OHbMt)。該文檔也對筆者有啟蒙作用,權威且可操作性強,強烈推薦Go開發者閱讀。

主站蜘蛛池模板: 四平市| 滁州市| 天峨县| 虹口区| 佛冈县| 永宁县| 徐汇区| 监利县| 北川| 黔南| 汾阳市| 洪洞县| 乐安县| 安多县| 门头沟区| 深泽县| 沁水县| 凌源市| 汤原县| 泰安市| 青阳县| 恩施市| 麻城市| 五河县| 浙江省| 昆山市| 芷江| 安多县| 青冈县| 苗栗市| 阿拉善盟| 江山市| 精河县| 珠海市| 定南县| 皋兰县| 舞阳县| 沿河| 瑞金市| 金堂县| 皮山县|