優化程式效能(1)

2021-09-24 04:08:10 字數 1899 閱讀 9196

我們知道,大多數編譯器,包括gcc,向使用者提供了一些對他們所使用的優化的控制,最簡單的控制就是指定優化級別。例如,命令列選項「-og」呼叫是讓gcc使用一組基本的優化、以選項「-o1」或更高(如「-o2」或「-o3」)呼叫gcc會讓它使用更大量的優化。

但是,優化編譯器存在著侷限性:①.編譯器必須很小心地對程式只使用安全的優化②.編譯器必須假設不同的指標可能會指向記憶體中的同乙個位置③.大多數編譯器不會試圖判斷乙個函式是否有***(比如函式可能會修改全域性程式狀態的一部分),編譯器會假設最糟糕的情況,並保持所有的函式呼叫不變。

我們先來定義乙個程式效能的度量標準是每元素的週期數(cpe,cycles per element),這個度量標準在後面會經常用到。

處理器活動的順序是由時鐘控制的,時鐘提供了某個頻率的規律訊號,通常用千兆赫茲(ghz),即十億週期每秒來表示。例如:4ghz處理器表示處理器時鐘執行頻率為每秒4*10^9個週期,時鐘週期的時間是時鐘頻率的倒數,通常用納秒(1ns=10 ^-9 s)或皮秒(1ps=10 ^-12s)為單位,乙個4ghz的時鐘週期為0.25ns或250ps,用時鐘週期來表示,度量值表示的是執行了多少條指令,而不是時鐘執行的有多快。

注:我們更願意用每個元素的週期數而不是每次迴圈的週期數來衡量

通常我們對程式的優化有:

通過消除迴圈的低效率來實現優化,例如**移動,即識別執行多次但是計算結果不會改變的計算,因而可以將計算移動到**前面不會被多次求值的部分。

通過減少過程呼叫來實現優化。

通過消除不必要的記憶體引用,在一些函式的迭代過程中,可能會出現從記憶體讀出的值就是上次迭代後寫入記憶體的值,我們可以建乙個臨時變數acc來積累計算出來的值,只有在迴圈完成後結果才寫入記憶體。

隨著試圖進一步提高效能,必須考慮利用處理器微體系結構的優化,也就是處理器用來執行指令的底層設計。

在實際的處理器中,是同時對多條指令求值的,這個現象稱為指令級並行,兩種下界描述了程式的最大效能,當一系列操作必須按照嚴格順序執行時,就會遇到延遲界限,在下一條指令開始之前,這條指令必須結束,當**中的資料相關限制了處理器利用指令級並行的能力時,延遲界限能夠限制程式效能。吞吐量界限刻畫了處理器功能單元的原始計算能力,這個界限是程式效能的終極限制。

現代微處理器的兩個主要部分:指令控制單元(icu)和執行單元(eu)。前者負責從記憶體中讀出指令序列,並根據這些指令序列生成一組針對程式資料的基本操作;而後者執行這種操作。

現代處理器採用了一種稱為分支**的技術。處理器會猜測是否會選擇分支,同時還**分支的目標位址。使用投機執行的技術,處理器會開始取出位於它**的分支會跳到的地方的指令,並對指令解碼,甚至在它確定分支**是否正確之前就開始執行這些操作。

使用投機執行技術對操作求值,但是最終結果不會存放在程式暫存器或資料記憶體中,直到處理器能確定應該實際這些指令。

eu接收來自取指單元的操作,通常,每個時鐘週期會接收多個操作。

讀寫記憶體是由載入和儲存單元實現的。載入單元處理從記憶體讀資料到處理器的操作。儲存單元處理從處理器寫資料到記憶體的操作。

退役單元記錄正在進行的處理,並確保它遵守機器級程式的順序語義。一旦一條指令的操作完成了,而且所有引起這條指令的分支點也都被確認為**正確,那麼這條指令就可以退役了,所有對程式暫存器的更新都可以被實際執行了。如果引起該指令的某個分支點**錯誤,這條指令會被清空,丟棄所有計算出來的結果。(任何對程式暫存器的更新都只會在有指令退役時才會發生!!!)

暫存器重新命名是一種形式的資料**,通過這種機制,值可以從乙個操作直接**到另乙個操作,而不是寫到暫存器檔案再讀出來,這使得第二個操作能夠在第乙個操作完成後盡快開始。

Java程式效能優化 1

1.優化概述 設計調優是對系統在巨集觀層面上 質 的優化。優化,jvm優化都是對系統微層面上 量 的優化。設計優化的乙個顯著特點是,它可以規避某乙個元件的效能問題,而非改良該元件的實現。比如 系統在元件a需要等待某事件e才能觸發乙個行為。如果元件a通過迴圈監控不斷檢測事件e是否發生,其監控行為必須會...

優化程式效能

編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...

優化程式效能

l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...