1. 程式人生 > >CSAPP第五章 總結

CSAPP第五章 總結

本章節分為兩個部分,第一個部分是在效能優化上對於所有的及其的共同考慮
第二個部分就是對於一種理想的機器型別:X86進行對用優化操作
5.1:
編譯器會為我們做大部分的工作,但是由於一起可能含有不確定性的操作,編譯器不敢為我們進行優化,導致了低效率
5.2:
測試程式效能的標準:CPE計算機執行這個程式需要多少週期
計算方式:實際時間/計算機每週期的時間
5.3:
gcc的不同優化級別-O1 -O2也會導致時間不相同(和)
5.4:
如果迴圈的判斷條件是一個複雜度為O(n)甚至更高的函式,那麼需要使用一個臨時變數去儲存這個函式值,作為判斷的條件。有的時候為了減少函式呼叫的開銷,O(1)的函式也被鼓勵這種操作
5.5:
減少函式的呼叫,尤其是長度只有一行到兩行的函式,在大量呼叫這種函式的前提下,通過直接將這個函式寫在主題中,從而通過破壞程式的模組性來實現程式效能的提升
5.6:
取出記憶體中儲存的值,和寫入記憶體中的值都是一項很耗費時間的操作
一個經常訪問的記憶體地址,或者對於一個短時間內進行了大量更改的記憶體地址,我們可以向將其讀取到當地變數:也就是暫存器中,之後再進行後續操作

之後我們進入第二部分(通過X86的特殊實現機制,我們來針對這一種型別的機器來進行優化)

/重點在第二部分/

5.7:
學會畫基於組合語言的資料流圖
資料流圖中關鍵路徑的長度決定了函式的快慢
5.8:
簡單的迴圈展開
5.9:
通過多個變數積累(迴圈展開的進階形式)
和重新結合變數來提高程式的速度(使得記憶體取到暫存器中的操作同時進行)
5.11:
限制因素:
暫存器不夠用,導致5.11中的優化無法實現
處理分治預測的時候,儘量寫計算機可預測的分支(計算機預測分支是根據函式執行的歷史來預測的)
在處理不可預測的分支的時候,儘量手動用C語言實現類似conditional move 而不是jump操作

5.12
理解記憶體:
其實就是理解系統資料的傳輸以及Cache暫存器的執行機理