amd64軟體優化學習筆記(未完待續)

2021-06-16 08:20:50 字數 2348 閱讀 8255

, by einsteininict。

1,在單精度浮點變數後面加上f,可以顯示的通知編譯器不把單精度當多雙精度來處理。(除非記憶體非常緊張,否則最好不要用)

2,當用陣列模式進行訪問時,使用陣列名比使用指標能夠給編譯器提供更多的資訊進行優化。當然有的時候並非如此,因此要通過test來看哪種方法更合適。

3,對於一些長度確定的短小的迴圈,考慮將其展開。不但可以減小分支**等的開銷,而且可以充分利用register進行優化,消除資料依賴性等。

4,在符合分支條件中,選擇合適的表示式順序以充分利用short circuit特性。(需要嚴密的測試效能差異)

5,if語句中,考慮兩點:

a)邏輯表示式的短路特性

b)將經常發生的事情放在附近

6,動態記憶體分配時,注意對位址進行對齊。

7,在迴圈中,利用register來避免不必要的store-to-load開銷(解除raw依賴)。

8,匹配store和load size(??)

9,在沒有連續或者近似連續的case的地方,用if,else來替代switch。另外,在switch中,按照可能性的順序從高到低排列case,可以減小分支比較的次數。

10,使用函式原型,對於static的函式加上static修飾符,有時可以給編譯器提供更多的資訊以供優化。

11,養成使用const修飾符的習慣,不但可以是**更加robust,而且可以方便編譯器進行優化。對於使用的資料,修飾資訊越多,對於**的理解越到位,也更加方便進行優化。

12,消除迴圈中的不變數,不僅是資料,也包括控制流。從最內層迴圈一直往外進行優化。

13,利用迴圈展開等方法盡量讓流水線,暫存器等更加飽滿,以充分利用寶貴資源。

14,將大的表示式拆分成小的表示式以避免重複計算,因為ansi中的一些標準禁止編譯器進行拆分。

15,對於結構體中的變數的宣告,按照size從大到小的順序排列並進行padding,這樣,他們就能夠很好的對齊(??)。而且結構體的陣列也能夠很好的對齊。對於區域性變數的宣告,也按照從大到小的順序進行定義。

16,當乙個表示式中有多個整數除法時,以乘代除,提高速度。

17,避免在乙個函式內部頻繁的對指標進行解引用。因為指標可能存在別名的問題,編譯器不敢貿然進行優化。這樣,頻繁的解引用有可能造成訪存量增加而成為瓶頸。如果必要,可以在函式開頭將指標指向的內容拷貝到區域性變數中來,這樣或許會充分利用register。

18,對於陣列的索引,使用ptrdiff_t不但可以提高可移植性,而且通常會得到更好的效能。

19,考慮整數運算元的符號對效能的影響,選擇合適的資料型別。amd64中,signed integer 到float的轉換比unsigned integer到float的轉換更快。

a) unsigned types

i. division and remainders

ii. loop counters

iii. array indexing

b) signed types

i. integer to floating pointconversion

20,加速浮點除和開方運算

如果應用中有大量浮點除或者開方運算,可以考慮通過inline彙編用sse指令或3dnow來實現,或者是用支援sse和3dnow的編譯器。亦或者通過設定x87的精度來提高速度。

21,對於32位的浮點到整數轉換,有專門的3dnow指令pf2id來實現。對於double to int,可以用以下方法:#define double2int(i, d) \

double x;

int i;

double2int(i,x);

22,when usingld, include the followingcommand line option:

-bsymbolic

if usinggccto build a library, add this option to the command-line:

-wl,-bsymbolic

key optimization

1,避免記憶體尺寸的不匹配(比如寫兩個4位元組的連續記憶體,然後讀開始位址的8位元組資料抑或相反),應該讓讀和寫的尺寸都一樣大。這樣方便進行forwarding,否則此時的延遲是非常大的。因為不但要寫,還要讀。解決方案是利用cpu中已有的指令和儲存單元(register),保證資料讀寫尺寸的一致性。

2,保證資料物件是自然對齊(位址是尺寸的倍數)的(很重要)。

3,對於乙個快速通用的記憶體拷貝,呼叫ms或者gcc工具提供的memcpy(),該函式對各種blocksize和alignment都做了優化。對於小的資料塊,使用inline彙編:load,load,store,store

intel 軟體優化學習筆記

by einsteininict。軟體優化是一門藝術,需要從應用層演算法,作業系統,硬體體系結構等多方面來考慮。一般來說,應用層演算法和資料結構的設計對於提高程式的效能最為關鍵,但這也必須依賴於作業系統和體系結構所提供的計算模型。很多時候,人們會首先根據計算模型中的一些不變的東西,設計出應用層演算法...

mysql優化學習筆記

定位執行效率低的sql語句 通過explain分析效率低的sql 通過show profile分析sql 通過trace分析優化器如何選擇執行計畫 確定問題,採取措施優化 匹配全值,條件所有列都在索引中而且是等值匹配 匹配值的範圍查詢,字段必須在索引中 匹配最左字首,復合索引只會根據最左列進行查詢 ...

效能優化學習筆記

js css鬆散耦合盡量避免直接用js操作樣式,改為控制類名 element.classname edit 解耦應用邏輯和事件處理程式 使用常量優化效能,提公升 維護性 避免全域性查詢 優化迴圈效能乙個基本的for迴圈 for let i 0 i values.length i 乙個減值操作的for...