1. 程式人生 > >程式優化的三個級別

程式優化的三個級別

  程式優化的三個級別 
                                               

[email protected] 2004.11.07整理

tag:程式碼優化,程式優化,綜級優化,程式碼調整,新的視角,表驅動狀態機

文章來源於abp論壇中的一篇帖子:http://bbs.allaboutprogram.com/viewtopic.php?t=1063 
(原文章寫於2003.10.14晚)

到了allaboutprogram後被人叫做"效能狂人",我也不知道為什麼會有這個稱號,其實我並不是一個偏激的人,相反我很隨和,平易近人...(哈哈)。為了與新的身份大致相符,所以嘗試寫篇文章,寫寫自己理解的優化的三個級別。

有人不談優化,甚至憎惡優化,我只能說那只是因為他沒有能力做到!那是他還不能按時寫出程式、不能寫出正確的程式、不能寫出規範的程式。很多優秀的程式設計師都喜歡追求最快的程式速度,我想大多數程式設計師可能都想使自己寫的程式能夠比別人寫的程式執行得更快;

優化前需要問自己的幾個問題:為什麼要優化 、優化的目標是什麼、哪些部分才需要優化、能夠接受由此帶來的可能的資源消耗(人力、維護、空間等)嗎?

程式優化有三個層級;它們依次產生更顯著的優化程式碼,在考慮優化方案時可以嘗試從不同的層級著手思考優化的方案: 
(也許有人表達過這些觀點了,但這也是我對優化的實際理解 ;我的分類方法主要依據了具體去實現一個優化時思考問題的切入角度來劃分的,有時候他們之間的界限也並不明顯,具體是不是產生更顯著的優化效果也不是確信的)

第一級:程式碼調整 
程式碼調整是一種區域性的思維方式;基本上不觸及演算法層級;它面向的是程式碼,而不是問題; 
所以:語句調整,用匯編重寫、指令調整、換一種語言實現、換一個編譯器、迴圈展開、引數傳遞優化等都屬於這一級; 
這個級別的優化需要掌握大量的小的優化技巧和知識,需要不斷的積累; 
簡單的語句調整、公共表示式提取、廢程式碼刪除等當前的很多編譯器也能做到了,但也需要了解一些編譯器的優化能力使自己的程式碼配合編譯器做好優化; 
用匯編重寫並不是簡單把高階語言改寫為彙編實現,那樣寫的彙編很可能沒有當今的編譯器產生的程式碼好,所以如果決定用匯編實現,那就應該按照彙編的角度來規劃自己的實現,適當的參考編譯器生成的彙編碼也是可取的(特別是新手,我也一樣);在某些領域,使用CPU的新特性和新的指令集等將產生巨大的效能收益,這些地方經常採用彙編來實現。

第二級:新的視角 
新的視角強調的重點是針對問題的演算法;即選擇和構造適合於問題的演算法;(氣泡排序還是快排的選擇問題是這一級早就應該完成的)很多經典演算法都對問題作了一些假設(包括我們當前已經完成的演算法實現),而在面對實際問題時“新的視角”提示我們應該重新檢視這些假設,並嘗試不同的思考問題的角度,尋求適合於問題的新演算法; 
發掘問題的本來意義,從不同的角度思考面對的問題,使用適合於問題的的演算法; 嘗試打破一些規則,發掘和懷疑自己的某些假定,恢復問題的本來面目;

第三級:表驅動狀態機 
將問題抽象為另一種等價的數學模型或假想機器模型,比如構造出某種表驅動狀態機;這一級其實是第二級的延伸,只是產生的效果更加明顯,但它有其本身的特點(任何演算法和優化活動都可以看作是他的投影);這一級一般可以產生無與倫比的快速程式, 
要達到這一級需要大量修煉的;並且思考時必須放棄很多已有的概念或者這些概念不再重要,比如:變數、指標、空間、函式、物件等,剩下的只應該是那個表驅動狀態機; 我想把這種境界描述為:空寂中,一些輸入驅動著一個帶有狀態的機器按設定好的最短路線運轉著;除此之外have nothing; 既:把解決一個問題的演算法看作一個機器,它有一些可變的狀態、有一些記憶、有一些按狀態執行的規則,然後一些輸入驅動這個機器運轉;這就是第三級要求的思考優化問題的切入點,也就是尋找一部機器,使它執行經過的路徑最短(可能是速度也可能是空間等等)


要掌握一級優化,是很多人經過努力都能夠達到的層次,需要的是不斷的積累各方面的技巧就行了(雖然很繁瑣),寫出的程式碼可以稱為“好的程式碼”;
要掌握二級優化,需要的是對問題的理解能力和一些創造力,能夠針對問題產生新的見解;寫出的程式碼可以稱為“優秀的程式碼”; 
要掌握三級優化,必須具有豐富的想象力和創造力,需要大量的修煉和對問題本質的苦苦思索;寫出的程式碼可以稱為“非凡的程式碼”; 
能夠將這三個層級的優化熟練運用(我想把這種境界稱作“綜級優化”)的人必須掌握比別人更多的知識、瞭解更多的知識領域、瞭解最底層的技術和最高層的抽象;並且還要求有豐富的實踐經驗、想象能力和創造能力; 這些都是不可或缺的;


警示:不是所有的程式碼(專案)都需要優化 
警示:不是每個人都要去做優化工作 
警示:優化是有方向和側重點的,不只是單純的速度 
警示:首先是正確,然後才有優化 
警示:簡潔的程式碼,很多時候就是最好的程式碼 
警示:優化不是一種理論,它是一種實踐 
警示:充分優化的笨拙演算法實現始終比不上一個更好的演算法的普通實現,即優化首先是設計的優化 
警示:程式碼優化是門黑色藝術,程式碼的優化永無止境 
警示:無論是誰,他的資源也不是無限的,程式碼優化要避免過猶不及 
警示:如果確信不需要優化,那根本不進行優化,就是最好的優化! 

版權宣告:本文為博主原創文章,未經博主允許不得轉載。