try...catch對性能的影響

最近因爲系統的功能擴展,需要對原來的系統做一些改進。在這個過程中發現原來的系統中存在很多try...catch語句,並且是用於循環中的,同時想起有人說過過多的try...catch對性能有影響。趁現在有時間想對這個問題做進一步的研究。
先上網搜了一下,關於這個的討論還真不少,在此就不多說了,大家有興趣的話可以看看。現在只做一個簡單的總結。

一、大家在討論的時候經常引入新的問題,最終導致結果不明確。經常引入的問題有這麼幾個
1、該不該使用try...catch?
2、什麼時候使用try...catch?
3、.net框架中try...catch的實現機制?
主題:try...catch對性能的影響

二、這個幾個問題不可否認是存在關係的,我覺得它們存在這樣的層次關係
問題從機制到應用依次爲(深—>淺):
問題3、.net框架中try...catch的實現機制?
問題主題:try...catch對性能的影響
問題2、什麼時候使用try...catch?
問題1、該不該使用try...catch?

由上面的層次關係我們就可以很清楚的知道,如果深層次的問題弄清楚了,那淺層次的問題就會迎刃而解。

那下面就開始解決問題了

由於能力有限,我至今對.Net中try...catch的實現機制也不是很清楚,只是從大家的回覆中略知一二,在此就說了,以免誤導其他人,這也是爲什麼問題的名字不是“.Net中try...catch的實現機制”的原因。O(∩_∩)O~

如果對本質的問題沒有搞清楚,那隻好從現象上做一些判斷了。爲此我寫了這樣一段簡單的,由於代碼很簡單,代碼的功能就不用文字描述了,直接看代碼就可以了:

            int count = 10000;
            int value = 0;
            DateTime dt1 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                try
                {
                    value = int.Parse("1");
                }
                catch
                {

                }
            }
            DateTime dt2 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                    value = int.Parse("1");
            }
            DateTime dt3 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                try
                {
                    value =int.Parse("AA");
                }
                catch
                {

                }
            }
            DateTime dt4 = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                if (int.TryParse("AA", out value))
                {

                }
                else
                {

                }
            }
            DateTime dt5 = DateTime.Now;


執行完成後幾個DateTime型的變量的值如下:
第一次
dt1 15:00:56.3593750
dt2 15:00:56.3593750
dt3 15:00:56.3750000
dt4 15:01:34.1718750
dt5 15:01:34.1718750
第二次
dt1 18:15:57.7500000
dt2 18:15:57.7500000
dt3 18:15:57.7500000
dt4 18:16:37.0937500
dt5 18:16:37.0937500

從執行結果我們可以看出,最耗時的是第三個循環,其它三個循環不能看出本質上的差別來。所以我們可以得出這樣的結論:

在不拋出異常的情況下,使用try...catch和不使用try...catch沒有本質上的區別;
在拋出異常的情況下,也不是異常中的處理語句會造成性能損失(因爲此示例中沒有對異常做任何處理),而是拋出異常的過程會造成性能的損失。

所以如果想進一步的深入研究,那隻需對.net框架異常的拋出機制研究即可,因爲這個造成性能損失的關鍵。

 

 

 

 

發佈了17 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章