優化程式要點

2022-08-15 16:09:13 字數 1568 閱讀 5180

以下內容總結自《深入理解計算機系統》一書。

選擇一組適當的演算法和資料結構

寫出編譯器能夠有效優化以轉換成高效可執行**的源**

消除不必要的工作

消除不必要的函式呼叫、條件測試和記憶體引用

提高並行性

處理器具有指令級並行能力,同時執行多條指令。通過迴圈展開、增加累計變數、改變操作順序等方式增加**的並行度。

使用**剖析程式以下**中,v為陣列型別,**的功能是將v的元素通過op操作累積到dest變數中。

vec_length函式的時間複雜度為o(n)。詳細**可參見《深入理解計算機系統》一書。

// o(n^2)

void combine1(vec_ptr v, data_t *dest)

}

措施1:消除迴圈的低效率

將每次呼叫返回相同結果的函式移至迴圈外,避免重複呼叫導致的低效率。

// o(n)

void combine2(vec_ptr v, data_t *dest)

}

措施2:減少過程呼叫

減少迴圈內的函式,可以直接使用索引訪問資料,減少封裝函式。

void combine3(vec_ptr v, data_t *dest)

}

措施3:消除不必要的記憶體引用

記憶體訪問比暫存器訪問慢很多,可以先使用區域性變數儲存結果,迴圈結束後寫回dest中。

void combine4(vec_ptr v, data_t *dest)

*dest = acc;

}

措施4:迴圈展開

通過增加每次迭代計算的元素數量,減少迴圈的迭代次數。

void combine5(vec_ptr v, data_t *dest)

// 還可能剩乙個

for (; i < length; i++)

*dest = acc;

}

措施5:多個累計變數

使用多個累計變數,配合迴圈展開,可以有效增加並行度。

void combine6(vec_ptr v, data_t *dest)

for (; i < length; i++)

*dest = acc0 op acc1;

}

措施6:重新結合變換

合理分配操作的順序,可以有效提高指令的並行度。

void combine7(vec_ptr v, data_t *dest)

for (; i < length; i++)

*dest = acc;

}

盡量不要重複呼叫返回相同結果的函式,特別是那些時間複雜度不為o(1)的函式。

多使用區域性變數儲存計算的中間結果。

將不變的變數之間的操作放在一起,儘量減少操作之間的依賴性。

系統優化要點

這是常用的系統優化要考慮的點,在系統設計和 評審以及 優化時加以考慮,最大限度提高系統效能 1.優化演算法,選擇合適高效演算法,降低不必要遞迴,迴圈,多層迴圈巢狀,避免迴圈內初始化等。2.避免申請過多不必要的記憶體 3.及時釋放資源,降低資源使用時間,包括記憶體,io,網路,資料庫等。4.使用快取 ...

效能優化 要點

ui不可見時,及時釋放資源 頁面布局,盡量避免太多層級,避免被vm 頁面背景圖 view快取 使用renderscript opengl來進行複雜的繪圖操作 使用su ceview來替代view進行大量 頻繁的繪圖操作 自定義view中避免在ondraw方法裡面執行複雜的操作,避免建立物件。ui執行...

hibernate 優化要點

robbin總結的hibernate效能優化要點 1.盡量使用many to one,避免使用單項one to many 2.靈活使用單向one to many 3.不用一對一,使用多對一代替一對一 4.配置物件快取,不使用集合快取 5.一對多使用bag 多對一使用set 6.繼承使用顯示多型 hq...