利用 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 也是相當重要的課題。