2011-02-16 32 views
10

我有一個關於在沒有拋出異常的情況下使用異常處理的效率後果的假設性問題。什麼都沒有拋出時的異常效率

先來看看這個C#:

int simpleSimon, cautiousCarol, dangerousDave; 

try 
{ 
    simpleSimon = int.Parse("fail"); 
} 
catch 
{ 
    simpleSimon = 1; 
} 

try 
{ 
    cautiousCarol = int.Parse("1"); 
} 
catch 
{ 
    cautiousCarol = 1; 
} 

dangerousDave = int.Parse("1"); 

我相信,Dave的代碼會以最快/最有效的;而西蒙會因拋出異常而招致鉅額罰款。

但卡羅爾呢?她沒有例外,她會受到懲罰嗎?如果是這樣,那麼什麼樣和多大? (性能損失還是額外的內存使用或其他?)

+4

變量名+1! – JonH 2011-02-16 18:39:34

回答

6

這是一個JIT實現細節。 x86抖動必須在堆棧幀中設置16個字節,以幫助CLR在拋出異常時找到正確的catch塊。這應該需要大約3納秒。 64位版本的Windows(基於表而不是基於堆棧)的異常過濾在x64抖動上完全沒有工作。所需的額外內存大約相當(代碼與表格數據)。

這些都不應該與這樣的代碼有關,將字符串轉換爲整數是I/O操作。首先獲取數據的成本比任何解析都要輕鬆3到4個數量級。如果你不相信數據的來源,你當然會使用TryParse()。處理異常相當昂貴。

8

對於Carol沒有重大處罰。如果需要,只有某些跳轉纔會被註冊和執行。

作爲提示,請使用int.TryParse(...)來避免這種情況。

相關問題