在c#中,在空的try catch塊中花費了多少時間?C#編譯器是否優化了空的try/catch?
我聽說這是10-55ms之間,但我偏向於零/一個因爲編譯器會用一個空操作佔位符代替空嘗試捕捉。
任何可以驗證此信息的編譯器專家?
在c#中,在空的try catch塊中花費了多少時間?C#編譯器是否優化了空的try/catch?
我聽說這是10-55ms之間,但我偏向於零/一個因爲編譯器會用一個空操作佔位符代替空嘗試捕捉。
任何可以驗證此信息的編譯器專家?
如果當你說 「空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毫秒」附近。
正確!謝謝 – pithhelmet
我相信你得到這麼多downvotes的原因是,這可能不是合適的地方要問這個特定問題... – Jfabs
您可以查看生成的IL /字節碼自己。 [我如何查看C#編譯器生成的MSIL/CIL?爲什麼叫集合?](http://stackoverflow.com/questions/3326571/how-can-i-view-msil-cil-generated-by-c-sharp-compiler-why-is-it-called-集合) –
確保選擇一個好的標題,它確實有助於避免負面的初始反應/投票。已經提出的假設和基本問題是「我傾向於零/一,因爲編譯器將用一個無操作佔位符替換空的try catch」,所以關注這一點。 – user2864740