軟體優化技術真經 框架篇

2021-06-22 01:17:33 字數 1871 閱讀 8347

**:

軟體優化是一項系統工程。總體而言,整個優化框架可以分為兩個部分:設計優化和**優化。

1,設計優化

設計優化包括了軟體體系結構的優化,資料結構的優化,演算法的優化。

1.1軟體體系結構的優化

軟體優化首先要對整個軟體體系結構有個清晰的了解。在認識了整個軟體的目標功能後,圍繞這個目標,軟體的模組劃分,軟體的執行流程都要一清二楚。整個軟體的「資料流」和「控制流」都要能在頭腦中清晰的呈現出來。各個模組的介面和各個模組的資料結構間的關係,都要有清晰的認識。在這個基礎上,才能對各個模組做資料結構的優化和演算法的優化。

1.2資料結構的優化

資料結構的設計是個大學問。基本上,資料結構是為演算法服務的,所以要根據演算法來確定資料結構。但也有幾個我認為比較通用的原則。

第一,除非演算法有特殊的需要,否則盡量用緊湊性好的資料結構,如陣列。

第二,根據空間區域性性原理,盡量緊湊經常訪問的資料,合理選擇陣列結構和結構陣列。

第三,如果陣列比較大,其元素的尺寸應盡可能小,如可以用char就不要用short。除此以外,不要吝惜記憶體,盡量用int作為資料型別。

第四,如果cpu具有simd指令,則第三點要重新考慮,根據演算法需要,合理安排

陣列元素的尺寸。

1.3演算法的優化

演算法的優化可以分為兩種:演算法設計的優化和演算法實現的優化。

1.3.1

演算法設計的優化

演算法設計的優化是指對求解的問題提出更具效率的求解思路。好的演算法設計對軟體效能具有決定性影響。例如video encoder中motion vector的搜尋演算法有很多,選擇合適的演算法是很重要的。同時,演算法設計也是最有挑戰的,需要許多的實驗並根據應用需要。

1.3.2

演算法實現的優化

相對於演算法設計的優化,演算法實現的優化就簡單一些了。基本上,演算法實現的優化有兩種思路。

第一,避免計算。最好的優化就是「不計算」,仔細觀察演算法的實現,如果發現某些部分的計算結果在某些條件下是「還原」的,那就是說這個部分是做了「無用功「了。那麼就可以嘗試通過一些控制條件去避免計算。如video decoer的idct,統計一下各個分塊的值分布,就可以改進演算法實現,避免一些塊的計算。提高效率。

第二,重用計算。如果計算不可避免,就可以觀察是否可以重用已有計算。這其實也是一種「避免計算」,只不過前提是調整演算法實現,使得一些計算可以被重用。

2,**優化

如果說設計優化是全域性性的,是「內行」做的事情,那麼**優化就是區域性性的,是「外行「也可以做的事。如乙個有**優化經驗的audio codec工程師雖然沒有video codec的經驗,但是同樣可以對video codec的**進行優化。因為**優化依據的原理通常是可以適用於各個領域和平台的。如loop unroll通常是有效的。**優化因為可以是「只見樹木不見森林」,所以它的影響不是全域性性的。套用乙個**優化專家的話說,**優化通常可以使得乙個慢的程式變的快一些。我的理解是,如果脫離了設計優化,慢的程式做再多的**優化也不過是乙個快了一些的「慢程式」。

同理,好的**優化能使好的設計如虎添翼。因為通常好的設計,或者說遵循區域性性原理的設計更容易做**優化,優化的效果也更好。

**優化大致可以分為以下兩個部分:平台無關部分和平台相關部分

平台無關部分是指一些普適的優化原則。如迴圈展開,減少分支,內聯函式,指標運算,

位址對齊等等。

平台相關部分就是通常所說的彙編**優化。彙編**可以對某個平台做最貼心的優化。首先各個平台都有不同的「高效能」指令,如c55的雙mac,armv5e的dsp指令,xscale的wmmx等。其次,各個平台的流水線都不同,對指令排列有不同的要求,所以在彙編一級可以對指令做最好的調整。再次,只有在彙編一級,才可以拋開編譯器,使程式思維最貼近cpu邏輯,並避免一些不必要的計算,帶來最好效能。畢竟編譯器的智商以及它對程式的了解通常比我們程式設計師要差一些。

在下文,我將談談**優化的具體問題。

軟體優化技術真經 總論篇

軟體優化是一項系統工程。要理解軟體優化,首先對軟體要有個本質的認識。軟體是什麼呢?它是一組在計算機平台上執行的邏輯 這個概念比較拗口。第一,軟體是一組計算機能理解並執行的邏輯 第二,軟體一定是執行在某個計算機平台上,可能是大型機,可能是pc,可能是手機。好,認識了這兩點。就可以正確認識軟體優化。首先...

我看中國軟體 技術篇

寫這一系列文章的過程,也是乙個傷心的過程,就如同自已的缺點被一點一點慢慢地揭露,以至於到最後發現自已什麼都不是什麼都沒有,這種感覺是無法用言語來形容的,呵呵,不知你有過沒有?寫技術篇時,我的腦子有點亂,理不出清晰的框架,只能按下面的樣式零零碎碎地進行闡述,有用無用都是自已的積累與觀點,因此不在乎別的...

我看中國軟體 技術篇

寫這一系列文章的過程,也是乙個傷心的過程,就如同自已的缺點被一點一點慢慢地揭露,以至於到最後發現自已什麼都不是什麼都沒有,這種感覺是無法用言語來形容的,呵呵,不知你有過沒有?寫技術篇時,我的腦子有點亂,理不出清晰的框架,只能按下面的樣式零零碎碎地進行闡述,有用無用都是自已的積累與觀點,因此不在乎別的...