摘要:這一章節(jié)主要講述了以提高程序的運行速率進行程序優(yōu)化的三個層次(也就是優(yōu)化時間,而暫時不考慮空間性能的問題)旱函,并且主要介紹了如何做到指令級的優(yōu)化制轰。
關鍵詞:指令流水線
目錄:
??1. 程序的指令級優(yōu)化
??2. 程序的代碼級優(yōu)化
??3. 程序的算法級優(yōu)化
1. 程序的指令級優(yōu)化
我們知道,對一個單核的機器進行密集型計算的時候兑徘,使用多線程是不會有效率的提高的。但使用單個線程汽久,不同的代碼也會很大的性能差異鹤竭,如何單核的計算效率達到最大,就需要使用指令級的優(yōu)化景醇。
在計算機中有時鐘周期的概念臀稚,也就是進行一次操作需要的時間。我們說CPU的主頻是多少GHz的時候三痰,表明CPU一秒可以處理多少個操作吧寺。實際上CPU中有好幾個功能單元,每個功能單元實現(xiàn)不同的功能散劫,這些功能單元加在一起的頻率才是主頻稚机,而CPU指令的處理又是流水線化的。也就是一個指令的幾個操作就像流水線一樣會通過不同的功能單元進行處理获搏。
假設你的程序是順序運行的指令赖条,也就是一個指令結束以后,才能執(zhí)行一下個指令常熙,這樣每個時刻都只有一個功能單元在運行纬乍,這樣的代碼就不能利用流水線化的執(zhí)行方式了。最大壓榨CPU性能的方法應該是使指令填滿流水線裸卫。而這取決你的代碼實現(xiàn)的功能能否做到指令級的并行仿贬,以及你是否能寫出指令級并行的代碼。前者需要你判斷你的算法能否并行墓贿,比如實現(xiàn)兩個向量元素的相乘或者相加茧泪,很顯然不同元素之間的計算相互獨立,這是可以并行的聋袋,那么就可以寫出對應的完全流水線化的代碼队伟。至于如何寫,一般則是通過循環(huán)展開舱馅,比如張開兩次,每次循環(huán)做兩個元素的相加刀荒,這兩個相加操作在代碼中的特點就是代嗤,即使第一次相加操作不執(zhí)行,也不會影響第二次相加操作代碼的執(zhí)行缠借。也就是代碼之間是互不影響的干毅,而不是非得執(zhí)行前面的代碼,才能執(zhí)行后面的泼返,這樣的代碼是不能利用流水線功能的硝逢。
2. 程序的代碼級優(yōu)化
代碼級別優(yōu)化主要針對的時候代碼本身一些不合理進行優(yōu)化,比如反復重復的計算,if判斷語句渠鸽,循環(huán)語句叫乌,以及不斷的調用函數(shù),不斷的訪問存儲器等等徽缚。本來一個變量可以放入寄存器的憨奸,你的代碼非要把他放到存儲器中。雖然減少過程調用會破壞面向對象編程凿试,因為其主張一個函數(shù)只做一件事排宰,必然充斥著大量的過程調用,以保證其可擴展性和可讀性那婉,所以至于要不要減少過程調用這個依賴與你的應用場景板甘,需要自己做個權衡。
總之代碼級別的優(yōu)化详炬,主要是從代碼級就能看到的效果盐类,而無需對底層處理器有所認識。
3. 程序算法級優(yōu)化
程序算法級優(yōu)化就更容易懂了痕寓。實現(xiàn)同一個功能傲醉,不同的算法性能是不一樣的,適用的情況也是不同的呻率,可謂是各有優(yōu)劣硬毕,就比如說排序算法這么多,他們都有自己的優(yōu)點和缺點礼仗,或者有的時間復雜度高吐咳,有的空間復雜度高,有的依賴于特定的數(shù)據(jù)結構能表現(xiàn)更好元践。
所以你需要對數(shù)據(jù)結構和算法有扎實的理解韭脊。對于一個程序而言,這三個級別的優(yōu)化都起著非常重要的作用单旁。希望你不要只關注于算法級的沪羔。尤其是做底層應用的人。