csapp3e 第五章 優化程式效能

2021-09-25 09:27:23 字數 2645 閱讀 5593

前言

高效程式:1. 適當的演算法和資料結構。1. 將源**編碼成能夠被編譯器優化成高效可執行**(消除連續的函式呼叫,消除不必要的記憶體引用)。3, 將運算量特別大的計算任務分成多個部分,這些部分可在多核和多處理器的某種組合上平行計算(第12章)(展開迴圈,多個累計變數,重新結合,條件轉移)。

5.1優化編譯器的能力和侷限性

指標與指標操作,函式呼叫一般很少優化。因為會***。

函式呼叫,編譯器會使用內聯替換來優化。

一些情況下,最好阻止內聯替換,1. 用符號偵錯程式(如gdb)評估**時,2. 用**剖析評估程式效能時,等等。

5.2表示程式效能

每元素週期數cpe(斜率),迴圈展開,最小二乘擬合。

5.3程式示例

32位和64位整數或單雙精度浮點數操作效能都相同(除了除法)。

5.4消除迴圈的低效率

5.5減少過程呼叫

5.6消除不必要的記憶體引用

5.7理解現代處理器

延遲界限,吞吐量界限。

5.7.1整體操作

超標量,亂序處理。

5.7.2功能單元的效能

吞吐量給出了cpe的最小界限。

5.7.3處理器操作的抽象模型

整數加法的運算速度足夠快,超過了其他操作**資料的速度,測量出的cpe為1.27,大於關鍵路徑的長度所期望的1.00,至於為什麼這樣,需要更詳細的硬體設計知識(商業機密,不去考慮也能優化程式效能)。

5.8迴圈展開

上面描述的1.27,可以通過迴圈展開,減少迴圈的開銷,讓它接近於1.00。

使用第三或者更高等級,編譯器可以迴圈展開優化。

5.9提高並行性

轉換成

5.9.1多個累積變數

利用k個變數實現k*k展開迴圈。

5.9.2重新結合變換

acc = (acc op data[i]) op data[i+1] 慢於 acc = acc op (data[i] op data[i+1])

使用向量指令比上述的指令更快,32位元組的向量暫存器的32位操作新界限小了8倍,64位操作新界限小了4倍。

5.10優化合併**的結果小結

現代計算機有相當的計算能力,需要我們使用程式化的方式程式設計來誘發這些能力。

5.11一些限制因素

5.11.1暫存器溢位

累積變數數量超過暫存器數量,導致存到記憶體棧堆中。

5.11.2分支**和**錯誤處罰

錯誤處罰約19個週期。

多用條件轉移。

5.12理解記憶體效能

5.12.1載入的效能

cpe是4,載入操作的延遲決定,與l1級cache的4週期訪問時間一致。

5.12.2儲存的效能

當dst和src值不一樣時,cpe是1。當他們是不一樣時候,cpe是7。如何分析?

不一樣的時候,看似關鍵路徑是迴圈內的第一條和第二條語句。其實不是。因為val的值並沒有因迭代而變化。

一樣的時候:關鍵路徑是包含儲存、載入、浮點加。

記憶體子系統使用了很多優化。

區別是什麼?

我寫的是第二種,書本上是第一種,書本上彙編**和我寫的一致,所以兩者相同。

5.13應用:效能提高技術

p384,非常好的例子。有空再拿出來讀讀。

5.15小結

編寫源程式使得分支更容易**。

優化資料庫第五章

t sql使用下列語句來管理事務 1.begin transaction 2.commit transaction 3.rollback transaction 使用全域性變數 error判斷事務操作是否成功。1.error儲存最近一條sql語句的執行結果。2.如果sql語句執行成功,則 error...

第五章 優化程式效能

寫程式的最主要目標就是使它在所有可能的情況下都正確工作。程式設計師必須寫出 清晰簡潔 的 讀懂 理解 修改 編寫高效程式 1.選擇合適的演算法和資料結構 2.編寫出編譯器能夠有效優化以轉換成高效可執行 的源 3.針對運算量特別大的計算,平行計算 將乙個任務分成多個部分,這些部分可以在多核和多處理器的...

第五章 MongoDb索引優化 5 2

3 文件作為索引的鍵值 借鑑上面位址 a.單列索引 mongodb的官方文件上面是這樣說的 documents as keys indexed fields may be of any type,including documents 往資料庫recommender的表data中插入三條記錄 db....