2009-08-28 28 views
7

我想要一個真正在C#中進行實時編程或真正理解語言內部的人的回覆。C#實時試用Catch

我知道異常不應該用來處理正常處理,而只是用來檢測錯誤情況。關於這個話題有很多討論。

我想知道是否有任何運行時間從簡單的try/catch塊就位(它永遠不會捕捉到一個異常,除非程序將不得不終止)慢下來。 try/catch塊位於必須重複調用的函數中。我懷疑只有最小的成本。

可以根據CPU週期或其他任務(與浮點乘法相同的成本)或其他方式來量化成本嗎?

我們在Windows XP下使用Microsoft C#.Net 3.5。

+1

看看喬恩斯基特的資源例外和性能:http://www.yoda.arachsys.com/csharp/exceptions.html – 2009-08-28 15:55:29

回答

10

除非拋出異常,否則.NET異常的開銷成本非常低。有一個try/catch塊就位會產生非常小的性能影響。我發現幾乎沒有影響,即使在非常快速,緊密的循環中,也沒有發生異常處理。

但是,.NET中的異常在引發時非常昂貴。如果你拋出它們,它們往往對性能影響很大,而不是其他語言。這是由於創建異常時收集到的全部堆棧信息等。

這與一些其他語言(如python)的行爲相反,其中異常處理的成本較高,但拋出實際上相當高效。

但是,如果您擔心,我會建議您介紹自己的日常工作,並親自測試一下。這是我經歷了很多性能分析後的經歷。在您自己的代碼庫中沒有替代測量。

+0

其實,不直到您訪問發生堆棧跟蹤StackTrace屬性,或者如果異常通過進程邊界(即遠程處理/ wcf /等)創建異常也是非常低的成本,因爲構建只設置了一些屬性。由於拋出過程設置StackCrawlMarks會導致堆棧爬行,如果請求堆棧跟蹤時會產生中等成本......但在.NET 2.0中,除非實際訪問它,否則跟蹤不會發生每次拋出。 – jrista 2009-08-28 15:57:34

+0

是的 - 我實際上是指堆棧標記機制,但我的回答並不清楚。儘管如此,在我的分析中,這有一個相當大的開銷(儘管這是假設的關鍵系統)。 Rico Mariani有一篇很好的博客文章解釋了爲什麼,但對我而言,問題在於額外的緩存未命中和頁面錯誤:http://blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx – 2009-08-28 16:02:39

+0

謝謝爲那個信息。不幸的是,我們沒有工具來分析我們的代碼......我們只需要遵循最佳實踐。 – 2009-08-28 16:04:08