前言
高效程式: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....