2016-12-11 31 views
2

我有一個非常小的C#代碼標記爲內聯,但不工作。 我已經看到最長的函數會產生超過32個字節的IL代碼。 32字節的限制是否太短?內聯函數的32字節限制...不能太小?

// inlined 
[MethodImpl(MethodImplOptions.AggressiveInlining)] 
static public bool INL_IsInRange (this byte pValue, byte pMin) { 
    return(pValue>=pMin); 
} 

// NOT inlined 
[MethodImpl(MethodImplOptions.AggressiveInlining)] 
static public bool INL_IsInRange (this byte pValue, byte pMin, byte pMax) { 
    return(pValue>=pMin&&pValue<=pMax); 
} 

是否可以改變這個限制?

+0

「不工作」不是很有幫助。請提供詳細信息。如果有例外,請提供例外詳情。 – DeanOC

+3

@DeanOC:根據問題的標題和內容,我認爲問題在於函數未內聯。 –

+0

我的意思是它不作爲內聯函數運行,第一個函數使用內聯代碼運行,但第二個函數使用內聯代碼運行。我認爲這是一個關於JIT作爲限制啓發函數的32字節限制的問題,它決定了是否將它放在內聯中。我是對的?這是功能問題? – jmmcba

回答

1

我正在查找內聯函數標準。在你的情況下,我相信JIT優化在它能夠達成你的第二個功能的決定之前就超時了。對於JIT,內聯一個函數並不是一個優先事項,因此它正忙於分析你的長代碼。但是,如果將呼叫置於緊密循環中,JIT可能會將它們內聯,因爲內線呼叫優先於內聯。如果你真的關心這種微型優化,現在是時候切換到C++了。這是一個全新的勇敢的世界,您可以探索和利用!

我注意到這個問題在這個答案發布之後就被編輯了,這意味着高水平的交互性。那麼,我不知道爲什麼有32字節的限制,但保守地說,這似乎恰好是CPU高速緩存塊的大小。真是巧合!在任何情況下,代碼優化都必須使用特定的硬件配置來完成,並更好地將其保存在一個額外的文件中並與其組裝在一起。超時策略是愚蠢的,因爲優化不應該在運行時完成,與寶貴的代碼執行時間相競爭。優化應該在應用程序加載時完成,只有第一次在機器上運行時,一次完成。當檢測到硬件配置更改時,可以再次觸發它。再一次,如果你確實需要性能,那就去C/C++吧。 C#並不是爲了性能而設計的,絕不會將性能作爲首要任務。和Java一樣,C#也是爲安全而設計的,對於可能對性能造成的負面影響要謹慎得多。