利用 Stopwatch 類別來測試 Parse() 與 TryParse()

利用 Stopwatch 類別來測試 Parse() 與 TryParse()

Stopwatch 是 .NET 2.0 新的類別,可用來測試程式碼效能,將測試的程式碼利用 Start() 與 Stop() 方法包住。再利用 ElapsedTicks 或 ElapsedMilliseconds 屬性,取得程式碼所花費的單位 ticks 或是毫秒時間。

下面程式碼,用來測試 int.Parse() 與 int.TryParse() 成功與否的四種情形。

程式碼:

   1:  using System;
   2:  using System.Diagnostics;
   3:  namespace StopwatchTest
   4:  {
   5:      internal class Program
   6:      {
   7:          private static void Main(string[] args)
   8:          {
   9:              int num;
  10:              Stopwatch sw = null;
  11:              long ticks;
  12:   
  13:              // int.Parse 成功
  14:              sw = Stopwatch.StartNew();
  15:              for (int i = 1; i < 1000; i++)
  16:              {
  17:                  try
  18:                  {
  19:                      num = int.Parse("12");
  20:                  }
  21:                  catch (FormatException)
  22:                  {
  23:                      num = 0;
  24:                  }
  25:              }
  26:              sw.Stop();
  27:              ticks = sw.ElapsedTicks;
  28:              Console.WriteLine("int.Parse() 成功,花費 {0} ticks", ticks);
  29:   
  30:              // int.TryParse 成功
  31:              sw = Stopwatch.StartNew();
  32:              for (int i = 1; i < 1000; i++)
  33:              {
  34:                  if (int.TryParse("12", out num) == false)
  35:                  {
  36:                      num = 0;
  37:                  }
  38:              }
  39:              sw.Stop();
  40:              ticks = sw.ElapsedTicks;
  41:              Console.WriteLine("int.TryParse() 成功,花費 {0} ticks", ticks);
  42:   
  43:              // int.Parse 失敗
  44:              sw = Stopwatch.StartNew();
  45:              for (int i = 1; i < 1000; i++)
  46:              {
  47:                  try
  48:                  {
  49:                      num = int.Parse("12a");
  50:                  }
  51:                  catch (FormatException)
  52:                  {
  53:                      num = 0;
  54:                  }
  55:              }
  56:              sw.Stop();
  57:              ticks = sw.ElapsedTicks;
  58:              Console.WriteLine("int.Parse() 失敗,花費 {0} ticks", ticks);
  59:   
  60:              // int.TryParse 失敗
  61:              sw = Stopwatch.StartNew();
  62:              for (int i = 1; i < 1000; i++)
  63:              {
  64:                  if (int.TryParse("12a", out num) == false)
  65:                  {
  66:                      num = 0;
  67:                  }
  68:              }
  69:              sw.Stop();
  70:              ticks = sw.ElapsedTicks;
  71:              Console.WriteLine("int.TryParse() 失敗,花費 {0} ticks", ticks);
  72:              Console.WriteLine("End");
  73:          }
  74:      }
  75:  }

執行結果:

int.Parse() 成功,花費 1384 ticks
int.TryParse() 成功,花費 1560 ticks
int.Parse() 失敗,花費 42801870 ticks
int.TryParse() 失敗,花費 1374 ticks

在一般情況下,TryParse() 所花費的時間會比 Parse() 來得多,且兩者的效率並不會相差太多!但是,在發生 Exception 的情形之下,Parse() 所付出的代價,卻是遠遠大於 TryParse()。因此,在撰寫程式碼的時候,如何避免程式發生 Exception 也是相當重要的課題。