程序優化

程序優化

程序優化是指對解決同一問題的幾個不同的程序,進行比較、修改、調整或重新編寫程序,把一般程序變換為語句最少、佔用內存量少、處理速度最快、外部設備分時使用效率最高的最優程序

概念


優化前需要問自己的幾個問題:為什麼要優化、優化的目標是什麼、哪些部分才需要優化、能夠接受由此帶來的可能的資源消耗(人力、維護、空間等)嗎?
程序優化有三個層級。它們依次產生更顯著的優化代碼,在考慮優化方案時可以嘗試從不同的層級著手思考優化的方案:
(也許有人表達過這些觀點了,但這也是我對優化的實際理解;我的分類方法主要依據了具體去實現一個優化時思考問題的切入角度來劃分的,有時候他們之間的界限也並不明顯,具體是不是產生更顯著的優化效果也不是確信的)

代碼調整


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

新的視角


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

表驅動狀態機


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

結論


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