2009-06-09 138 views
8

/optimize C# compiler key是否有完整的優化列表可供您使用?什麼是/優化C#編譯器密鑰的目的?

編輯: 爲什麼它默認禁用? 它值得在真實世界的應用程序中使用嗎? - 默認情況下,僅在調試配置中禁用,在發佈中啓用。

+2

6月11日我會在我的博客上回答這個問題(常問!)。 – 2009-06-09 14:56:16

+2

http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx – 2009-06-11 15:24:32

回答

7

Scott Hanselman has a blog post顯示什麼/優化(在發佈版本中啓用)的一些示例。 ()如果你有一個方法A(),它調用B()調用C(),它是調用D(),編譯器可能會「跳過」B和C,並直接從A到D),這可能會在Release版本中導致「奇怪」的調用堆棧。

2

它在默認情況下被禁用,用於調試版本。對於發佈版本,它已啓用。

絕對值得使用這個開關,因爲編譯器會根據您擁有的代碼種類進行大量的調整和優化。 例如:跳過冗餘初始化,不會改變的比較等。

注意:如果開啓優化作爲代碼和生成的IL代碼可能不匹配,那麼調試可能會遇到一些困難。這是僅爲發佈版本打開的原因。

+0

哦的確如此。我會更新這個問題。但我仍然想知道什麼是精確的(或足夠的)優化列表... – 2009-06-09 10:18:10

2

MSDN page引用:

的/優化選項啓用或禁用 通過 編譯器進行優化,使您的輸出文件 更小,更快,更高效。

換句話說,它完全符合您的想法 - 優化由.NET VM執行的已編譯的CIL(公共中間語言)代碼。我不擔心具體優化是什麼 - 可以說它們很多,並且在某些情況下可能相當複雜。如果你真的對它做的事情感興趣,你可以調查Mono C# Compiler(我懷疑MS C#的細節是公開的)。

默認情況下禁用原因優化調試配置是它使某些調試功能不可能。幾個顯着的:

  • 也許最關鍵的是,在編輯並繼續功能是禁用的 - 即在執行過程中不修改代碼。
  • 中斷執行通常意味着錯誤的代碼行突出顯示(通常是預期的代碼行之後)。
  • 未使用的本地變量並未實際分配,甚至未被聲明。

真的,優化的默認選項永遠不應該改變。關閉調試選項非常有用,而將其用於發佈模式同樣明智。

+0

我不擔心優化,我只想知道它們是什麼:-) 我想upvote你努力,但有一件事阻止我這樣做:「.NET VM」:-) – 2009-06-09 10:44:56