牢記80-20準則(80-20 rule)
80-20準則說的是大約20%的**使用了80%的程式資源;大約20%的**耗用了大約80%的執行時間;大約20%的**使用了80%的記憶體;大約20%的**執行80%的磁碟訪問;80%的維護投入於大約20%的**上;通過無數臺機器、作業系統和應用程式上的實驗這條準則已經被再三地驗證過。80-20準則不只是一條好記的慣用語,它更是一條有關系統效能的指導方針,它有著廣泛的適用性和堅實的實驗基礎。
當想到80-20準則時,不要在具體數字上糾纏不清,一些人喜歡更嚴格的90-10準則,而且也有一些試驗證據支援它。不管準確地數字是多少,基本的觀點是一樣的:軟體整體的效能取決於**組成中的一小部分。
當程式設計師力爭最大化提公升軟體的效能時,80-20準則既簡化了你的工作又使你的工作變得複雜。一方面80-20準則表示大多數時間你能夠編寫效能一般的**,因為80%的時間裡這些**的效率不會影響到整個系統的效能,這會減少一些你的工作壓力。而另一方面這條準則也表示如果你的軟體出現了效能問題,你將面臨乙個困難的工作,因為你不僅必須找到導致問題的那一小塊**的位置,還必須尋找方法提高它們的效能。這些任務中最困難的一般是找到系統瓶頸。基本上有兩個不同的方法用來尋找:大多數人用的方法和正確的方法。
大多數人尋找瓶頸的方法就是猜。通過經驗、直覺、算命紙牌、顯靈板、傳聞或者其它更荒唐的東西,乙個又乙個程式設計師一本正經地宣稱程式的效能問題已被找到,因為網路的延遲,不正確的記憶體分配,編譯器沒有進行足夠的優化或者一些笨蛋主管拒絕在關鍵的迴圈裡使用彙編語句。這些評估總是以一種帶有嘲笑的盛氣凌人的架式發布出來,通常這些嘲笑者和他們的預言都是錯誤的。
大多數程式設計師在他們程式效能特徵上的直覺都是錯誤的,因為程式效能特徵往往不能靠直覺來確定。結果為提高程式各部分的效率而傾注了大量的精力,但是對程式的整體行為沒有顯著的影響。例如在程式裡使用能夠最小化計算量的奇特演算法和資料結構,但是如果程式的效能限制主要在i/o上(i/o-bound)那麼就絲毫起不到作用。採用i/o效能強勁的程式庫代替編譯器本身附加的程式庫(參見條款m23),如果程式的效能瓶頸主要在cpu上(cpu-bound),這種方法也不會起什麼作用。
在這種情況下,面對執行速度緩慢或占用過多記憶體的程式,你該如何做呢?80-20準則的含義是:胡亂地提高一部分程式的效率不可能有很大幫助。程式效能特徵往往不能靠直覺確定,這個事實意味著試圖猜出效能瓶頸不可能比胡亂地提高一部分程式的效率這種方法好到**去。那麼會後什麼結果呢?
結果是用經驗猜測程式那20%的部分只會導致你心痛。正確的方法是用profiler程式識別出令人討厭的程式的20%部分。不是所有的工作都讓profiler去做。你想讓它去直接地測量你感興趣的資源。例如如果程式太緩慢,你想讓profiler告訴你程式的各個部分都耗費了多少時間。然後你關注那些區域性效率能夠被極大提高的地方,這也將會很大地提高整體的效率。
profiler告訴你每條語句執行了多少次或各函式被呼叫了多少次,這是乙個作用有限的工具。從提高效能的觀點來看,你不用關心一條語句或乙個函式被呼叫了多少次。畢竟很少遇到使用者或程式庫的呼叫者抱怨執行了太多的語句或呼叫了太多的函式。如果軟體足夠快,沒有人關心有多少語句被執行,如果程式執行過慢,不會有人關心語句有多麼的少。他們所關心的是他們厭惡等待,如果你的程式讓他們等待,他們也會厭惡你。
不過,知道語句執行或函式呼叫的頻繁程度,有時能幫助你洞察軟體內部的行為。例如如果你建立了100個某種型別的物件,會發現你呼叫該類的建構函式有上千次,這個資訊無疑是有價值的。而且語句和函式的呼叫次數能間接地幫助你理解不能直接測量的軟體行為。例如,如果你不能直接測量動態記憶體的使用,那麼知道記憶體分配函式和記憶體釋函式的呼叫頻率也是有幫助的。(也就是,operators new, new, delete, and delete參見條款m8)
當然即使最好的profiler也是受其處理的資料所影響。如果用缺乏代表性的資料profile你的程式,你就不能抱怨profiler導致你優化程式的那80%的部分,從而不曾對程式通常的效能有什麼影響。記住profiler僅能夠告訴你在某一次執行(或某幾次執行)時乙個程式運**況,所以如果你用不具有代表性的輸入資料profile乙個程式,那你所進行的profile也沒有代表型。相反這樣做很可能導致你去優化不常用的軟體行為,而在軟體的常用領域,則對軟體整體的效率起相反作用(即效率下降)。
防止這種不正確的結果,最好的方法是用盡可能多的資料profile你的軟體。此外,你必須確保每組資料在客戶(或至少是最重要的客戶)如何使用軟體的方面能有代表性。通常獲取有代表性的資料是很容易的,因為許多客戶都願意讓你用他們的資料進行profile。畢竟你是為了他們需求而優化軟體。
軟體行業的 80 20 理論
80 20 規律告訴我們,80 的成果 於20 的努力。在軟體領域,80 的使用者只使用20 的功能。那麼我們為什麼不只開發那20 的功能呢?這個問題有很多很多解釋。我在這裡只講一點。也許你的每個客戶都只使用一小部分功能,比如說沒人使用超過5 的功能。但是,他們都分別使用不同的部分的功能。當你把每個...
80 20法則 交友貴在精
如果沒有人際關係,我們在這個世界上就算活著也與死無異。友誼是生活的中心,這話聽起來老套,確是真理。同樣,職場人際關係是成功的中心,這句話很有道理。這些人際關係究竟和80 20法則有何關係呢?答案是密切相關。我們要在質和量之間進行權衡,但一直以來我們又忽視了最重要的東西。80 20法則提供了3種引入深...
帕累託(「80 20」)法則
重要性的少數因子即能控制全域性 面對現在外部經濟不景氣,企業的成本不斷的上公升,而利潤確在下降。很多企業採取的一種最直接的減少企業成本的殺手鐗 裁員。確實裁員能夠為企業節省很多的開支,讓企業擁有更多的現金流應對當前的經濟不景氣,這樣看企業確實應該裁掉一些人。可是人裁掉了,事情還是得有人做啊!於是我們...