關於TryCatch捕獲錯誤的簡單性能測試


一直以來都很好奇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會耗時長很多,這個留待大牛去解釋,但以上測試表明在不出現錯誤的情況下二者的性能損耗差不多,但在出現錯誤的情況下卻相距甚大

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM