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