2019年8月6日 星期二

Try Catch 效能耗損測試

總結:
直接說結果,是有差別。證明try是會額外耗損資源。多少呢?少到你不會在乎,9億次只額外耗損不到19秒。平均使用一個try額外耗損0.000021毫秒(條件:未觸發catch)
建議:程式不要當機(crash)才是最重要的事,所以別因微不足道的耗損而刻意不使用或關閉。
當掉才是最該避免的事


提醒:只要跑進catch(異常發生)就一定會造成顯著的耗損
提外話:在跑程式時,我有發現一個現象,先執行for迴圈的比較吃虧。所以測試時我有作對調,外加Release+Debug版。所以執行四次。

說明:
執行次數:各自執行9000000*100=9億次
時間單位毫秒


  使用try 未使用try
測試1 6225 620
測試2 10228 6120
測試3 6173 624
測試4 9908 6673
     
加總 32534 14037

記錄圖:
看不懂很正常,因為只是給我自己作記錄用。







程式碼:
        private void 測試()
        {
            long T = 0;
            long T2 = 0;
            int A = 0;
            string B = "";
            System.Diagnostics.Stopwatch sw;
            System.Threading.Thread.Sleep(2000);
            for (int g = 1; g < 100; g++)
            {
                //無try
                A = 0;
                B = "";
                sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                for (int i = 0; i < 9000000; i++)
                {
                        A = i % 13;
                        A += 1;
                }
                sw.Stop();
                T2 += sw.ElapsedMilliseconds;
                //有try
                System.Threading.Thread.Sleep(1000);
                A = 0;
                B = "";
                sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                for (int i = 0; i < 9000000; i++)
                {
                    try
                    {
                        A = i % 13;
                        A += 1;
                    }
                    catch (Exception ex)
                    {
                        B = ex.Message;
                    }
                }
                sw.Stop();
                T += sw.ElapsedMilliseconds;
            }
            System.Threading.Thread.Sleep(1000);
            for (int g = 1; g < 100; g++)
            {
                //有try
                A = 0;
                B = "";
                sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                for (int i = 0; i < 9000000; i++)
                {
                    try
                    {
                        A = i % 13;
                        A += 1;
                    }
                    catch (Exception ex)
                    {
                        B = ex.Message;
                    }
                }
                sw.Stop();
                T += sw.ElapsedMilliseconds;
                //無try
                A = 0;
                B = "";
                sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                for (int i = 0; i < 9000000; i++)
                {
                    A = i % 13;
                    A += 1;
                }
                sw.Stop();
                T2 += sw.ElapsedMilliseconds;

            }
            txtMsg.AppendText(Environment.NewLine +"使用Try:" + T.ToString());
            txtMsg.AppendText(Environment.NewLine + "未使用Try:" + T2.ToString());
        }

沒有留言:

張貼留言