最近因爲系統的功能擴展,需要對原來的系統做一些改進。在這個過程中發現原來的系統中存在很多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框架異常的拋出機制研究即可,因爲這個造成性能損失的關鍵。