2011-12-06 64 views
2

知道異常的產生降低性能.NET異常,並表現

,但我無法找到該

爲什麼例外的產生降低性能的原因是什麼?

+3

檢查此問題:http://stackoverflow.com/questions/161942/how-slow-are-net-exceptions –

回答

1

嗯,因爲它有所作爲。做任何事都需要時間。

拋出一個異常會創建一個對象,獲取堆棧的副本,​​將堆棧放置兩次,也可能跨域進行編組。做東西需要時間。在一個理想的世界中,它也將是沒有被預測爲被採用的分支(因爲它應該是不太可能的分支),儘管我不知道這是否是這種情況。由於控制權已移到「遙遠」的某個地方,因此這也很可能導致緩存被重新填充的情況。

儘管如此,異常並不是特別慢,除非在調試器中運行(因爲顯而易見的原因,當拋出異常時會再次運行)。在測試和嘗試或者嘗試和報告更有意義的循環中進行try-and-catch是非常慢的,但這些都屬於微觀優化的範疇(「微優化「通常用作誹謗,但是當語義上更清晰的方法也稍微表現更好時,爲了清晰起見,這是一件好事 - 當我們爲了幾個循環而使事情變得不那麼清晰和語義上合理時, 「微優化」成爲負面)。

0

影響異常拋出的代價的一件事是一個包含調用堆棧信息的相當豐富的Exception對象。這需要花費一些時間和內存空間來爲我們構建和保存這些簡潔的信息。例如,非託管C++沒有這樣的信息調用堆棧,因此在C++更復雜的任務中進行調試。

0

「如果您遇到異常會嚴重影響您的性能的問題,那麼您在使用異常情況方面存在問題,而不僅僅是性能問題。」 - Jon Skeet

換句話說,如果您將它們用於他們的意圖,那是特殊情況而不是常規控制流,拋出異常的性能懲罰不應該成爲問題。