|
|
|
到了allaboutprogram后被人叫做"性能狂人",我也不知道為什么會有這個稱號,其實我并不是一個偏激的人,相反我很隨和,平易近人...(哈哈)。為了與新的身份大致相符,所以嘗試寫篇文章,寫寫自己理解的優化的三個級別。 有人不談優化,甚至憎惡優化,我只能說那只是因為他沒有能力做到!那是他還不能按時寫出程序、不能寫出正確的程序、不能寫出規范的程序。很多優秀的程序員都喜歡追求最快的程序速度,我想大多數程序員可能都想使自己寫的程序能夠比別人寫的程序運行得更快; 優化前需要問自己的幾個問題:為什么要優化 、優化的目標是什么、哪些部分才需要優化、能夠接受由此帶來的可能的資源消耗(人力、維護、空間等)嗎? 程序優化有三個層級;它們依次產生更顯著的優化代碼,在考慮優化方案時可以嘗試從不同的層級著手思考優化的方案: (也許有人表達過這些觀點了,但這也是我對優化的實際理解 ;我的分類方法主要依據了具體去實現一個優化時思考問題的切入角度來劃分的,有時候他們之間的界限也并不明顯,具體是不是產生更顯著的優化效果也不是確信的) 第一級:代碼調整 代碼調整是一種局部的思維方式;基本上不觸及算法層級;它面向的是代碼,而不是問題; 所以:語句調整,用匯編重寫、指令調整、換一種語言實現、換一個編譯器、循環展開、參數傳遞 優化等都屬于這一級; 這個級別的優化需要掌握大量的小的優化技巧和知識,需要不斷的積累; 簡單的語句調整、公共表達式提取、廢代碼刪除等當前的很多編譯器也能做到了,但也需要了解一些編譯器的優化能力使自己的代碼配合編譯器做好優化; 用匯編重寫并不是簡單把高級語言改寫為匯編實現,那樣寫的匯編很可能沒有當今的編譯器產生的代碼好,所以如果決定用匯編實現,那就應該按照匯編的角度來規劃自己的實現,適當的參考編譯器生成的匯編碼也是可取的(特別是新手,我也一樣);在某些領域,使用CPU的新特性和新的指令集等將產生巨大的性能收益,這些地方經常采用匯編來實現。 第二級:新的視角 新的視角強調的重點是針對問題的算法;即選擇和構造適合于問題的算法;(冒泡排序還是快排的選擇問題是這一級早就應該完成的)很多經典算法都對問題作了一些假設(包括我們當前已經完成的算法實現),而在面對實際問題時“新的視角”提示我們應該重新檢視這些假設,并嘗試不同的思考問題的角度,尋求適合于問題的新算法; 發掘問題的本來意義,從不同的角度思考面對的問題,使用適合于問題的的算法; 嘗試打破一些規則,發掘和懷疑自己的某些假定,恢復問題的本來面目; 第三級:表驅動狀態機 將問題抽象為另一種等價的數學模型或假想機器模型,比如構造出某種表驅動狀態機;這一級其實是第二級的延伸,只是產生的效果更加明顯,但它有其本身的特點(任何算法和優化活動都可以看作是他的投影);這一級一般可以產生無與倫比的快速程序, 要達到這一級需要大量修煉的;并且思考時必須放棄很多已有的概念或者這些概念不再重要,比如:變量、指針、空間、函數、對象等,剩下的只應該是那個表驅動狀態機; 我想把這種境界描述為:空寂中,一些輸入驅動著一個帶有狀態的機器按設定好的最短路線運轉著;除此之外have nothing; 既:把解決一個問題的算法看作一個機器,它有一些可變的狀態、有一些記憶、有一些按狀態運行的規則,然后一些輸入驅動這個機器運轉;這就是第三級要求的思考優化問題的切入點,也就是尋找一部機器,使它運行經過的路徑最短(可能是速度也可能是空間等等) 要掌握一級優化,是很多人經過努力都能夠達到的層次,需要的是不斷的積累各方面的技巧就行了(雖然很繁瑣),寫出的代碼可以稱為“好的代碼”; 要掌握二級優化,需要的是對問題的理解能力和一些創造力,能夠針對問題產生新的見解;寫出的代碼可以稱為“優秀的代碼”; 要掌握三級優化,必須具有豐富的想象力和創造力,需要大量的修煉和對問題本質的苦苦思索;寫出的代碼可以稱為“非凡的代碼”; 能夠將這三個層級的優化熟練運用(我想把這種境界稱作“綜級優化”)的人必須掌握比別人更多的知識、了解更多的知識領域、了解最底層的技術和最高層的抽象;并且還要求有豐富的實踐經驗、想象能力和創造能力; 這些都是不可或缺的; 警示:不是所有的代碼(項目)都需要優化 警示:不是每個人都要去做優化工作 警示:優化是有方向和側重點的,不只是單純的速度 警示:首先是正確,然后才有優化 警示:簡潔的代碼,很多時候就是最好的代碼 警示:優化不是一種理論,它是一種實踐 警示:充分優化的笨拙算法實現始終比不上一個更好的算法的普通實現,即優化首先是設計的優化 警示:代碼優化是門黑色藝術,代碼的優化永無止境 警示:無論是誰,他的資源也不是無限的,代碼優化要避免過猶不及 警示:如果確信不需要優化,那根本不進行優化,就是最好的優化!
|
|
|