2011-03-21 62 views

回答

5

它們從未由C#編譯器內聯過。只有const字段。

你可以看看C#編譯器優化here

可以確保方法或屬性訪問器是從未與此屬性適用於它內聯:

[MethodImpl(MethodImplOptions.NoInlining)] 
7

不 - 因爲它不會在編譯時有發生;它發生在JIT時間。 C#編譯器不會執行任何內聯;代碼最終運行在CLR上。

可以使用cordbg發現此問題,打開所有JIT優化,但您需要深入瞭解彙編代碼。我不知道有什麼方法可以在代碼中發現它。 (你可以使用調試器API來實現,儘管這可能會禁用一些內聯以開始。)

3

您必須查看機器代碼。在方法調用中設置一個斷點,當它打到時,右鍵單擊並選擇「Go To Assembly」。如果您沒有看到CALL語句,那麼它會被內聯。您必須在閱讀機器代碼時加速一點才能確定,但​​您可能會看到內置方法中的調用。

爲了使其準確無誤,您必須使用工具+選項,調試,常規,取消「在模塊加載時抑制JIT優化」。這確保了抖動的行爲與沒有調試器時的行爲相同,當優化器關閉時,方法不會被內聯。

1

在方法體內添加代碼以使用StackFrame檢查堆棧跟蹤。根據我的經驗,內嵌方法不在此堆棧跟蹤中。