2014-03-13 75 views
0

在c#中,在空的try catch塊中花費了多少時間?C#編譯器是否優化了空的try/catch?

我聽說這是10-55ms之間,但我偏向於零/一個因爲編譯器會用一個空操作佔位符代替空嘗試捕捉。

任何可以驗證此信息的編譯器專家?

+0

我相信你得到這麼多downvotes的原因是,這可能不是合適的地方要問這個特定問題... – Jfabs

+3

您可以查看生成的IL /字節碼自己。 [我如何查看C#編譯器生成的MSIL/CIL?爲什麼叫集合?](http://stackoverflow.com/questions/3326571/how-can-i-view-msil-cil-generated-by-c-sharp-compiler-why-is-it-called-集合) –

+2

確保選擇一個好的標題,它確實有助於避免負面的初始反應/投票。已經提出的假設和基本問題是「我傾向於零/一,因爲編譯器將用一個無操作佔位符替換空的try catch」,所以關注這一點。 – user2864740

回答

5

如果當你說 「空try catch塊」,你的意思是字面上

try 
{ 
} 
catch 
{ 
} 

然後是,建立在與編譯器優化開啓(即「釋放「模式),它不會發出任何IL指令。例如:

private void Test() 
{ 
    try 
    { 
    } 
    catch 
    { 
    } 
} 

編譯爲:

IL_0000: ret 

這是相同的,就好像它是一個空的方法。

然而,當優化導通關閉(即 「調試」 模式)時,它發出:

IL_0000: nop   
IL_0001: nop   
IL_0002: nop   
IL_0003: leave.s  IL_000A 
IL_0005: pop   
IL_0006: nop   
IL_0007: nop   
IL_0008: leave.s  IL_000A 
IL_000A: nop   
IL_000B: ret 

鑑於空方法將是:

IL_0000: nop   
IL_0001: ret 

無論是否這些IL指令在執行編譯器時被剝離,我不積極。但是,這仍然只適用於沒有編譯器優化的情況下進行編譯,因爲在啓動JIT編譯器之前,在初始編譯爲IL期間,try/catch會被剝離。

編輯:我才意識到我可能沒有真正回答問題:

釋放模式,零時間是在一個空的try/catch消耗。
調試模式,一個非零時間用於空try/catch,因爲它仍然發出必要的IL代碼以用於調試/斷點目的,並且需要一些 JIT編譯。但是,這將是一個可以忽略的小時間量。絕對無處附近的「10-55毫秒」附近。

+0

正確!謝謝 – pithhelmet

2

如果檢查通過適當的軟件編譯後的代碼(如ILspy或反射器),你可以看到空塊將被刪除由編譯器completley。

ILSpy image

+5

未來,你會想要備份你的答案與來源等 – Jfabs

+0

@Jfabs檢查這個http://prntscr.com/30ielc(我希望我得到這個問題的權利,因爲主題的名稱是相當混淆) –

+0

看起來你對我來說是正確的。感謝您的跟進。我建議你編輯你的文章,以包含該截圖作爲你的陳述的證據。 – Jfabs