爲了代碼優化的目的,是否需要在#if (DEBUG)
預處理程序指令中將Debugger.Log()
打包爲Debugger.Log()
,或者在構建RELEASE
配置時,C#編譯器是否仍然生成優化代碼?我應該在#if(DEBUG)中調用Debugger.Log()嗎?
9
A
回答
5
沒有任何一種優化對這呼叫RELEASE模式。
該呼叫存在於IL
。唯一的區別是,如果不存在DEBUGGER,則它不起作用。
從技術文檔Debugger.Log:
如果沒有附加的調試器,此方法沒有效果。
我會建議測量您的應用程序的性能,然後選擇遵循的步驟。
如果沒有顯着差異(從您的應用程序的角度來看),我會保持原樣。
通過這種方式,在需要的時刻,你可以連接到你的應用程序與調試器,讓你可能需要從日誌中,作爲Debugger.Log
將在該點工作的消息。
0
以下代碼的快速測試(.NET 4,推出,在任何CPU)
class Program
{
static void Main(string[] args)
{
#if (DEBUG)
Debugger.Log(0, "category", "msg");
#endif
}
}
產生此IL
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 8
L_0000: ret
}
正如你可以看到有向Debugger.Log
NO呼叫。
1
這是Debugger.Log()的聲明,如從參考源檢索到:
// Posts a message for the attached debugger. If there is no
// debugger attached, has no effect. The debugger may or may not
// report the message depending on its settings.
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern void Log(int level, String category, String message);
注意,有上的方法沒有[條件]屬性和它所攜帶的[MethodImplAtttribute]屬性。這意味着該方法實際上是在用C++代碼編寫的CLR中實現的。
所以方法調用將作出,不管配置如何。您可以從SSCLI20源代碼發行版clr/src/vm/debugdebugger.cpp中找到該方法的實現。它使用OutputDebugString(),這是一個winapi函數,它在調試器中顯示字符串(如果已連接)。或者像SysInternals的DbgView.exe這樣的工具。如果兩者都不存在,那麼api調用就不會做任何事情並很快返回。您只需支付幾納秒的函數調用開銷。
對於方法調用沒有任何好的方法可以優化,無論您構建調試還是發佈配置,它都會以相同的方式執行。有權訪問Release版本中的調試信息當然可以得心應手,您可以自行決定是否需要關閉該功能。很難說這些納秒是否對您的程序有可觀察的影響。衡量,不要假設任何事情。
相關問題
- 1. 應該將調用OututDebugString包裝在#ifdef DEBUG條件塊中嗎?
- 2. 請分析我的GEMFILE,應該ruby-debug只在開發中嗎?
- 3. 我應該在ServiceController上調用Close()嗎?
- 4. 使用HttpContext.Current.IsDebuggingEnabled或#if DEBUG更好嗎?
- 5. 我應該忽略asp.net核心應用程序中的\ bin \ Debug \ netcoreapp1.0 \目錄嗎?
- 6. 我應該在庫調用中使用我自己的typedefs嗎?
- 7. #if RELEASE會像#if DEBUG那樣在C#中工作嗎?
- 8. 我應該同步notifyObservers調用嗎?
- 9. 我應該調用base.OnAuthorization(filterContext)嗎?
- 10. 我應該*真的*調用DataBind()嗎?
- 11. 我應該在`else if`中刪除不必要的`else`嗎?
- 12. 在調用File.Delete之前,我應該調用File.Exists嗎?
- 13. php - 我應該在調用Location:header之後調用exit()嗎?
- 14. 我們應該在不同的調用中重用cublasHandle_t嗎?
- 15. 我應該使用autocommit = False在Sqlalchemy中調用回滾嗎?
- 16. 我應該在EDT中創建的線程中調用InvokeLater嗎?
- 17. 在Python中,我應該在if塊中返回後使用else嗎?
- 18. 如何在Eclipse中使用if(DEBUG)?
- 19. 在Rails中,我應該啓用serve_static_assets嗎?
- 20. 我應該在android中使用getMeasuredState()嗎?
- 21. 我應該在RecyclerView中使用CursorLoader嗎?
- 22. 我應該在Matlab中使用arrayfun嗎?
- 23. 我應該在Flex4中使用Sprite嗎?
- 24. 我應該在Perl中使用autobox嗎?
- 25. 我應該在IntentService中使用WakeLock嗎?
- 26. #if DEBUG指令
- 27. 函數應該調用嗎?
- 28. 應該調用finish()嗎?
- 29. 我應該在Android AsyncTask中調用super.onPostExecute(result)嗎?
- 30. 我應該在UI線程中調用`Service`的函數嗎?