2010-10-26 50 views
2

可能重複:
Performance Cost Of 'try'.NET try/catch便宜嗎?

我在 「最佳實踐異常處理」 偶然發現了這句話在MSDN

「使用異常處理比較好,因爲更少的代碼是在正常情況下執行「

在是否應該ch在調用某個方法前調用該對象的狀態,或者調用該方法並捕獲該異常。以上建議是在發生例外情況時很少發生。

假設屬性檢查並不意味着昂貴的計算,而只是返回一個狀態值,在非拋出的情況下try/catch塊的執行成本與屬性檢查相比便宜多少?

我想知道這個建議,因爲即使try/catch是免費的或者接近免費的,被調用的方法在很多情況下都會由它自己做一堆檢查。

+0

但即使try/catch是免費的,建議使用它而不是檢查狀態嗎? – Holstebroe 2010-10-26 16:09:26

+0

您應該採取合理的措施來防止在可能的情況下引發異常;我認爲這可能取決於你期望「例外」的頻率。如果它可能有點常見,請先進行測試。如果它非常罕見,請拋出異常。 – 2010-10-26 16:27:40

回答

8

.NET中的例外情況非常便宜,除非它們被引發。一旦發生異常,有效成本就會上升很多。這就是說,我強烈建議編程到這裏最可維護的解決方案,並且在後來當且僅當在測量之後證明是問題時擔心性能。

剛剛返回狀態的屬性get方法被優化爲字段查找,並且幾乎是單個操作 - 任何情況通常都會比以後慢。但是,我懷疑異常處理會對整體速度造成任何明顯的影響,除非它處於一個非常非常緊密的循環中 - 在這種情況下,整體性能可能不會比您爲避免異常處理而引入的檢查更差。

+0

這正是我的觀點。在這種情況下,這裏主要的是可維護性。這就是爲什麼我想知道爲什麼這個建議在兩者之間進行選擇時強調性能。 – Holstebroe 2010-10-26 16:20:44

1

「例外情況適用於特殊情況」,不適用於正常控制流程。

IME,C#異常可能會增加一個明顯的性能損失,例如當您在循環中捕獲數千個異常時。

+0

我的問題不是關於實際拋出異常的情況,而是關於try/catch包裝調用的最佳做法,很少拋出異常與檢查狀態。 – Holstebroe 2010-10-26 16:13:07

0

通常情況下,異常處理機制的設計意圖是試圖便宜並且投擲很昂貴。但是,例外情況肯定比大多數其他操作成本更高。儘可能避免拋出是性能最高的解決方案,如果您可以採用簡單的if語句而不是使用異常,請執行。

+0

我不一定認爲這裏的一些建議正在給予足夠的思考以獲得完整的結果。 「使用if而不是等待異常」是個不錯的建議,但是傳遞這樣的想法,即異常性能很差並且應該避免導致返回參數和錯誤代碼作爲返回值。在編寫你自己的類和方法時,你需要爲壞的情況拋出異常,並讓用戶(即使你是用戶)在調用鏈中更高的地方處理它們,並在那裏進行適當的處​​理過程。 – CodexArcanum 2010-10-26 16:13:50

+0

@CodexArcanum:這個問題專門處理性能問題。在絕大多數場景中,異常可能*的性能都低於錯誤代碼。我仍然使用它們。 – Puppy 2010-10-26 16:57:50

3

您正在取消報價。全報價(重點礦山):

如果事件是真正的無與倫比的和 是一個錯誤(如意外 檔案結尾),使用異常處理 是因爲更少的代碼更好在正常情況下執行 。如果 事件經常發生,使用 編程方法檢查 錯誤會更好。在這種情況下,如果發生異常,則例外將會花費更長的時間處理。

異常處理的開銷實際上來自捕捉的例外。如果一個異常沒有被拋出/被捕獲,它相對便宜。

以上報價的邏輯如下:

  • 如果您正在重複操作的次數和出現異常,那麼不執行檢查它不是合理,使用異常。您通過不重複每次迭代檢查來節省代碼週期。

  • 如果操作確實不是而是一遍又一遍地循環,然後檢查條件而不是捕獲異常。

第一點可以被認爲是不成熟的優化的情況下,但有效性的地步,但是,它只能是一個特例(沒有雙關語意)。

通常,您會希望按照文章的建議進行操作,並檢查某些狀態而不是依賴於異常處理。

+0

我不同意用作選擇正確檢查方法的文章中的主要決策標準的性能考慮因素。 – Holstebroe 2010-10-26 16:22:40

+0

@Holstebroe:我通常也會這樣做,但是,這篇文章是針對非常具體的情況的,就這一點而言,我不能不同意它所闡述的具體情況。這就是說,不要拍攝使者。 =) – casperOne 2010-10-26 17:41:36

2

使用try/catch的另一個好處是它允許您在一個塊中集中處理錯誤處理,特別是當函數中有多個可能引發異常的原因時。如果您不需要分別處理每種情況,那麼爲所有這些調用分配一個try/catch是有意義的,這樣可以集中處理異常。

更重要的是,它允許您最終使用,這是非常強大的功能,可以確保正確清理資源,無論是否引發異常。