[C#] 004.TryParse比Parse好 (效能差了近70萬倍)

讀【157個完美化C#的建議】一書的理解筆記 - 004

重點: 如標題 TryParse因為比Parse少了拋出異常例外的資訊,簡化為bool所以夠快

※Parse 為 .net FrameWork 1.0的產物 ,TryParse 為.net FrameWork 2.0的產物

流程說明
1. Parse執行1000次程式碼
2. TryParse執行1000次程式碼
3. 結果分析
4.結論

1. Parse執行1000次程式碼

以下為成功跑一千次的程式碼

        /// <summary>
        /// .Parse() 跑1000次,且成功
        /// </summary>
        /// <returns></returns>
        private string parseSuccessful()
        {
            //計時開始
            Stopwatch sw = Stopwatch.StartNew();
            double tempValue = 0;
            for (int i = 1000; i > 0; i--)
            {
                try
                {
                    tempValue = double.Parse("123");
                }
                catch (Exception ex)
                {
                    tempValue = 0;
                }
            }
            //計時結束
            sw.Stop();
            return string.Format("parseSuccessful: {0}{1}", sw.Elapsed.ToString(), "\r\n");
        }

以下為失敗跑一千次的程式碼

        /// <summary>
        /// .Parse() 跑1000次,且失敗
        /// </summary>
        /// <returns></returns>
        private string parseFailure()
        {
            //計時開始
            Stopwatch sw = Stopwatch.StartNew();
            double tempValue = 0;
            for (int i = 1000; i > 0; i--)
            {
                try
                {
                    tempValue = double.Parse(null);
                }
                catch (Exception ex)
                {
                    tempValue = 0;
                }
            }
            //計時結束
            sw.Stop();
            return string.Format("parseFailure : {0}{1}", sw.Elapsed.ToString(), "\r\n");
        }

2. TryParse執行1000次程式碼

以下為成功跑一千次的程式碼

        /// <summary>
        /// .TryParse() 跑1000次,且成功
        /// </summary>
        /// <returns></returns>
        private string tryParseSuccessful()
        {
            //計時開始
            Stopwatch sw = Stopwatch.StartNew();
            double tempValue = 0;
            for (int i = 1000; i > 0; i--)
            {
                if (double.TryParse("123", out tempValue) == false)
                {
                    tempValue = 0;
                }
            }
            //計時結束
            sw.Stop();
            return string.Format("tryParseSuccessful: {0}{1}", sw.Elapsed.ToString(), "\r\n");
        }

以下為失敗跑一千次的程式碼

        /// <summary>
        /// .TryParse() 跑1000次,且失敗
        /// </summary>
        /// <returns></returns>
        private string tryParseFailure()
        {
            //計時開始
            Stopwatch sw = Stopwatch.StartNew();
            double tempValue = 0;
            for (int i = 1000; i > 0; i--)
            {
                if (double.TryParse(null, out tempValue) == false)
                {
                    tempValue = 0;
                }
            }
            //計時結束
            sw.Stop();
            return string.Format("tryParseFailure: {0}{1}", sw.Elapsed.ToString(), "\r\n");
        }

3. 結果分析

主程式呼叫,顯示執行後的時間

        private void Form1_Load(object sender, EventArgs e)
        {
            //Parse 效能
            textBox_Perfomance.AppendText(this.parseSuccessful());
            textBox_Perfomance.AppendText(this.parseFailure());

            //TryParse 效能
            textBox_Perfomance.AppendText(this.tryParseSuccessful());
            textBox_Perfomance.AppendText(this.tryParseFailure());

        }

執行結果

4.結論

  Parse耗費時間 TryParse耗費時間 相差時間 相差倍率
成功 00:00:00.0002293 00:00:00.0001602 00:00:00.0000691 0.43倍
失敗 00:00:25.1429854 00:00:00.0000339 00:00:25.1429515 741679倍

TryParse因為比Parse少了拋出異常例外的資訊,簡化為bool所以夠快

github連結(Vs2015) : 點我下載