2015-04-03 59 views
2

我一直覺得C#編譯器的/ optimize標誌沒有太大的作用。諸如this one之類的文章描述了IL中相對較少的優化:大部分都歸入JIT。然而,最近我試圖加速一些CPU密集型代碼(想想很多遍歷數組和字典以及簡單的數字),並且我嘗試開啓優化只是爲了踢。結果是速度提高了3x改進。請注意,這純粹是通過點擊VS項目屬性頁面中的「優化」複選框。切換DEBUG和TRACE常量沒有性能影響。/optimize標誌啓用哪些運行時優化?

儘管小的IL優化可能會導致這種改變是完全可能的,但這對我來說似乎很令人驚訝。在優化閱讀時,我發現這個珍聞在MSDN docs

/優化也告訴公共語言運行庫在 運行時優化代碼。

我很好奇這是什麼意思。這是否意味着JIT不會優化非優化程序集中的代碼?這可以啓用什麼類型的優化?

+0

http://blogs.msdn.com/b/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx – 2015-04-03 12:53:59

+0

@ DanielA.White:這似乎是集中在IL優化。你能把我指向處理運行時間的部分嗎? – ChaseMedallion 2015-04-03 14:15:12

+0

@downvoter:爲什麼倒戈? – ChaseMedallion 2015-04-03 14:15:26

回答

4

打開項目的Build選項卡中的「優化代碼」選項確實是兩個的東西。它將/ optimize +選項傳遞給C#編譯器,它執行您已知的次要MSIL優化。但它獲取C#編譯器在元數據中發出[DebuggableAttribute]屬性。你會得到DebuggableAttribute.IsJITOptimizerDisabled設置爲虛假

抖動使用它來決定是否啓用優化器。所以,是的,你現在已經啓用了,獲得3倍加速並不罕見。

調試器也發揮作用,它可以強制優化器本身。相關設置爲工具+選項,調試,常規,「抑制JIT優化」複選框。通常打開,所以當你調試時你永遠不會得到優化的代碼。相當重要的是,經過優化的代碼很難調試。當您想查看優化的機器代碼時,您希望關閉該選項。

請記住,你做錯了什麼。 .NET項目的默認版本配置始終已經選中了優化選項。所以你有理由打開它是不合邏輯的。只有剖析.NET項目的Release版本。

+0

從你所說的話來看,這聽起來像代碼將與優化標誌打開或關閉一樣可調試。在那種情況下,爲什麼在迭代和運行單元測試時使用的調試版本中關閉它? – ChaseMedallion 2015-04-04 15:47:58

+0

不,你會失去一些功能,比如不能在{花括號}上設置斷點。那些「微小的變化」。單元測試應該只測試Release版本,沒有點測試軟件在用戶機器上的運行方式不同。儘管特定於發佈的錯誤並不常見。雖然使用浮點代碼。 – 2015-04-04 16:01:14