基础才是重中之重~老赵写的CodeTimer是代码性能测试的利器

转自:http://www.cnblogs.com/lori/archive/2012/07/19/2599604.html

ForegroundColor;
 45             Console.ForegroundColor = ConsoleColor.Yellow;
 46             Console.WriteLine(name);
 47
 48             // 2. Record the latest GC counts
 49             //GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
 50             GC.Collect(GC.MaxGeneration);
 51             int[] gcCounts = new int[GC.MaxGeneration + 1];
 52             for (int i = 0; i <= GC.MaxGeneration; i++)
 53             {
 54                 gcCounts[i] = GC.CollectionCount(i);
 55             }
 56
 57             // 3. Run action
 58             Stopwatch watch = new Stopwatch();
 59             watch.Start();
 60             long ticksFst = GetCurrentThreadTimes(); //100 nanosecond one tick
 61             for (int i = 0; i < iteration; i++) action();
 62             long ticks = GetCurrentThreadTimes() - ticksFst;
 63             watch.Stop();
 64
 65             // 4. Print CPU
 66             Console.ForegroundColor = currentForeColor;
 67             Console.WriteLine("\tTime Elapsed:\t\t" +
 68                watch.ElapsedMilliseconds.ToString("N0") + "ms");
 69             Console.WriteLine("\tTime Elapsed (one time):" +
 70                (watch.ElapsedMilliseconds / iteration).ToString("N0") + "ms");
 71             Console.WriteLine("\tCPU time:\t\t" + (ticks * 100).ToString("N0")
 72                + "ns");
 73             Console.WriteLine("\tCPU time (one time):\t" + (ticks * 100 /
 74                iteration).ToString("N0") + "ns");
 75
 76             // 5. Print GC
 77             for (int i = 0; i <= GC.MaxGeneration; i++)
 78             {
 79                 int count = GC.CollectionCount(i) - gcCounts[i];
 80                 Console.WriteLine("\tGen " + i + ": \t\t\t" + count);
 81             }
 82             Console.WriteLine();
 83         }
 84
 85
 86
 87         public static void Time(string name, int iteration, IAction action)
 88         {
 89             if (String.IsNullOrEmpty(name))
 90             {
 91                 return;
 92             }
 93
 94             if (action == null)
 95             {
 96                 return;
 97             }
 98
 99             //1. Print name
100             ConsoleColor currentForeColor = Console.ForegroundColor;
101             Console.ForegroundColor = ConsoleColor.Yellow;
102             Console.WriteLine(name);
103
104             // 2. Record the latest GC counts
105             //GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
106             GC.Collect(GC.MaxGeneration);
107             int[] gcCounts = new int[GC.MaxGeneration + 1];
108             for (int i = 0; i <= GC.MaxGeneration; i++)
109             {
110                 gcCounts[i] = GC.CollectionCount(i);
111             }
112
113             // 3. Run action
114             Stopwatch watch = new Stopwatch();
115             watch.Start();
116             long ticksFst = GetCurrentThreadTimes(); //100 nanosecond one tick
117             for (int i = 0; i < iteration; i++) action.Action();
118             long ticks = GetCurrentThreadTimes() - ticksFst;
119             watch.Stop();
120
121             // 4. Print CPU
122             Console.ForegroundColor = currentForeColor;
123             Console.WriteLine("\tTime Elapsed:\t\t" +
124                watch.ElapsedMilliseconds.ToString("N0") + "ms");
125             Console.WriteLine("\tTime Elapsed (one time):" +
126                (watch.ElapsedMilliseconds / iteration).ToString("N0") + "ms");
127             Console.WriteLine("\tCPU time:\t\t" + (ticks * 100).ToString("N0")
128                 + "ns");
129             Console.WriteLine("\tCPU time (one time):\t" + (ticks * 100 /
130                 iteration).ToString("N0") + "ns");
131
132             // 5. Print GC
133             for (int i = 0; i <= GC.MaxGeneration; i++)
134             {
135                 int count = GC.CollectionCount(i) - gcCounts[i];
136                 Console.WriteLine("\tGen " + i + ": \t\t\t" + count);
137             }
138             Console.WriteLine();
139         }
140     }


有了上面的codeTimer我们就来测试一个吧,如字条串和并的问题,用+=还是用StringBuilder呢,有点经验的程序员肯定说是StringBuilder,是的,确实是后者,那我们就来看看这
 
两种方法测试的结果吧
 


 1      CodeTimer.Time("String  Concat", 100000,
 2                  () =>
 3                  {
 4                      var s = "1";
 5                      for (int i = 1; i < 10; i++)
 6                          s = s + "1";
 7                  });
 8
 9       CodeTimer.Time("StringBuilder Concat", 100000,
10                () =>
11                {
12                    var s = new StringBuilder();
13                    for (int i = 1; i < 10; i++)
14                        s.Append("1");
15                });


测试的结果如下:
 


从图中我们可以看到StringBuilder快的很明显,无论是执行时间,还是对CPU的消耗及GC回收都远低于String的拼结,所以,才有以下结论:
 
在字符串拼结时,请使用StringBuilder吧!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值