一直以來都很好奇TryCatch捕獲一個錯誤會對性能有多大的損耗,有的人說差異是倍數級的,有的人說差異不大,今天忽然心血來潮就自己寫了個Demo測試,因為曾經自己寫過一篇文章提到不要濫用TryCatch來捕獲已知的錯誤,卻沒有用事例佐證過,當然結果也是如預期一般
static void Main(string[] args) { int loopCount=100; List<string> strList = new List<string>(); for (int i = 0; i < loopCount; i++) { strList.Add("str" + i); } int intTemp = 0; Stopwatch sw2 = new Stopwatch(); sw2.Start(); foreach (string str in strList) { Console.WriteLine("不用TryCatch"); int.TryParse(str, out intTemp); } sw2.Stop(); Stopwatch sw = new Stopwatch(); sw.Start(); foreach (string str in strList) { try { Console.WriteLine("這是TryCatch"); intTemp = Convert.ToInt32(str); } catch (Exception ex) { //異常不做處理 } } sw.Stop(); Console.WriteLine("循環次數" + loopCount + "不用TryCatch耗時:" + sw2.ElapsedMilliseconds); Console.WriteLine("循環次數" + loopCount + "這是TryCatch耗時:" + sw.ElapsedMilliseconds); Console.WriteLine("按回車鍵退出" ); Console.ReadLine(); }
為了直觀地看到每一次轉換是否進行了,所以在每一次轉換前都輸出一次是否用到TryCatch,當loopCount為100時運行結果如下:
而當把loopCount的值加大為10000時輸出結果如下:
不同的運行環境下的耗時結果不一樣,但是兩者之間的耗時差距是很大的
當然了,這樣的測試有點片面,但從測試數據我們足以得到一種信息——不要把可預知的異常放到TryCatch里面讓系統捕獲處理
忽然想到,我這個測試時在轉換錯誤時的測試,那么程序如果不捕獲到異常會怎么樣呢,把代碼改成如下
for (int i = 0; i < loopCount; i++) { strList.Add( i.ToString()); }
運行1000次時結果如下(運行環境不同會出現不同結果,我測試多次都是用TryParse比較耗時,大約多100-300)
而在運行10000次時結果如下:
為了驗證是否因為TryParse和Convert之間有差異,將程序改動后運行1000次結果如下:
10000次運行結果如下:
多次運行發現結果基本相差不大,偶爾會出現不用TryCatch會耗時長很多,這個留待大牛去解釋,但以上測試表明在不出現錯誤的情況下二者的性能損耗差不多,但在出現錯誤的情況下卻相距甚大