Try Catch Block是否會影響效能?
跟網友在部落格上討論效能時提到一個議題--在迴圈中加入try...catch是否會影響效能?
依我的認知,try...catch只有在發生Exception時才會嚴重危害效能,平時正常執行時,我們倒可以"幾乎忘了它的存在"。
不過,我過去似乎還真沒用測試驗證過這一點,既然聊到了,就順手寫幾行Code實測一番:
using System;
using System.Diagnostics;
namespace TryCatchCost
{ class Program
{ static void Main(string[] args)
{ Stopwatch sw = new Stopwatch();
int RUN_COUNT = 200 * 10000;
long sum = 0;
bool flag10K = false;
//Test 1, no try catch
sw.Start();
for (int i = 0; i < RUN_COUNT; i++)
{ sum += i;
if (i == 10000) flag10K = true;
}
sw.Stop();
Console.WriteLine("Test1 Sum={0:N0} Time={1:N0}ms", sum, sw.ElapsedMilliseconds);
//Test 2, try catch
sw.Reset(); sum = 0;
sw.Start();
for (int i = 0; i < RUN_COUNT; i++)
{ try
{ sum += i;
if (i == 10000) flag10K = true;
}
catch (Exception e)
{ Console.WriteLine("Error: {0}", e.Message); }
}
sw.Stop();
Console.WriteLine("Test2 Sum={0:N0} Time={1:N0}ms", sum, sw.ElapsedMilliseconds);
//Test 3, try catch and one exception
sw.Reset(); sum = 0;
sw.Start();
for (int i = 0; i < RUN_COUNT; i++)
{ try
{ sum += i;
if (i == 10000)
throw new ApplicationException("10K"); }
catch (Exception e)
{ Console.WriteLine("Error: {0}", e.Message); }
}
sw.Stop();
Console.WriteLine("Test3 Sum={0:N0} Time={1:N0}ms", sum, sw.ElapsedMilliseconds);
Console.Read();
}
}
}
Test1, 2, 3都分別執行200萬次的統計加總,Test2與Test1差別在於Test2中加入try catch,但完全不觸發catch段的流程;Test3則故意觸發一次Exception。為了公平起見,三個測試都加入一列if (i == 10000)。測試數據如下:
Test1 Sum=1,999,999,000,000 Time=17ms
Test2 Sum=1,999,999,000,000 Time=18ms
Error: 10K
Test3 Sum=1,999,999,000,000 Time=46ms
Test1與Test2的執行時間相同,應可推論加入try…catch不影響效能。而即使200萬次只觸發1次例外,Test3的執行時間比Test1, 2慢了一倍以上。算是驗證了推論---try…catch只有在發生Exception時才會影響效能,請安心使用。