學過程式編譯的人知道,呼叫函式需要cpu執行引數壓棧、暫存器儲存與恢復、跳轉指令等操作,開銷比較大,高頻繁的呼叫函式對效能有影響,在c/c++語言裡產生了macro巨集,由於巨集不是函式不會產生上述開銷,是一種比較好的優化,但巨集不是強型別程式設計,於是vc++產生了inline內聯函式,inline優化就是將內聯函式展開,就沒有了函式呼叫的cpu開銷,效能上等同於巨集,而且是強型別程式設計。
我的某些c#函式需要高效能,也就想到通過inline實現,但在visual studio 2010沒找到inline方法,查詢大量網上資料,才知道目前為止只有c++支援inline,c#4.0從原始碼到clr和il都不支援內聯函式,期待以後的c#5.0或更高版本可以支援inline。
雖然c#不支援inline,但是jit支援自動inline,即將il轉成真正機器碼時,會自動將某些函式進行inline展開,只是條件非常苛刻,網上提到jit自動進行inline展開的一些選擇依據:
1)函式內部有迴圈語句、catch語句等複雜結構,都不做inline優化。
2)函式體比較長的不做inline優化,只有比較簡單的才可能inline優化。(有人說il不足32位元組才做inline),
2)編譯成機器碼時,inline展開的**比函式呼叫更短的,一定做inline。(注:如果引數多而**少,就符合此情況)
從上述可知:
1) property適合自動inline優化,不必擔心property的效能比field欄位低,
2) 如果期望inline優化的函式,一定要寫得小,力爭編譯後的il不超過32位元組。
其實 是否做inline優化應該從呼叫的頻繁度考慮,而jit無法了解頻繁度,因此自動inline優化效果並不理想,網上許多人都討論過這點,但微軟就是不支援c#的inline,也許微軟認為c++才需要關心效能,而c#關注快速開發,不必理會這些開銷吧。
轉至:
C inline 內聯函式
內聯函式 1 內聯函式定義和作用 將乙個函式宣告為inline,那麼函式就成為內聯函式。內聯函式通常就是它在程式中每個呼叫點上 內聯地 展開。從定義上看,內聯函式跟一般函式不一樣,一般函式呼叫的時候是需要呼叫開銷的 比如出棧入棧等操作 內聯函式從定義上看更像是巨集,但是跟巨集不一樣。內聯函式的作用主...
C Inline 內聯函式小結
為解決 中頻繁呼叫小函式,消耗大量棧空間的問題,因而引入修飾符inline。執行速度比常規函式稍快,但以 膨脹為代價 函式內聯,節約的是處理函式呼叫機制的時長。若函式執行時間短,函式內聯的效益較高,反之效益降低 使用限制 1 不可遞迴使用 2 函式體較大的時候不適合使用 3 必須和函式定義放在一起才...
C inline內聯函式使用規則
inline函式的作用 定義 內聯函式避免頻繁呼叫函式對棧記憶體重複開闢所帶來的消耗,但是不能包含複雜的結構控制語句例如while switch,並且內聯函式本身不能直接呼叫遞迴函式 自己內部還呼叫自己的函式 在c 中,為了解決一些頻繁呼叫的小涵數大量消耗棧空間或者是叫棧記憶體的問題,特別的引入了i...