基础才是重中之重~老赵写的CodeTimer是代码性能测试的利器
2012-07-20 17:14
363 查看
转自:/article/4624210.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吧!
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吧!
相关文章推荐
- 第十五回 基础才是重中之重~老赵写的CodeTimer是代码性能测试的利器
- 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器
- 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器
- 将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器
- ios测试基础二:mac 安装并使用git下载代码步骤
- 性能测试利器之---WAS
- LoadRunner性能测试基础知识问答
- 再探Java 7:最新特性更新、代码示例及性能测试
- 性能测试:基础知识
- 性能测试基础(一)
- Python实战(2)re编译代码性能测试
- iOS中代码性能测试的方法
- JMeter性能测试基础 (1) - 安装及简单使用
- Java 7:最新特性、代码示例及性能测试
- 使用console进行性能测试和计算代码运行时间
- 基础才是重中之重~ConcurrentDictionary让你的多线程代码更优美
- 性能测试基础整理
- 《Web性能测试实战》读书笔记--性能测试基础
- 在hyperpacer基础上进行的自动化性能测试
- 基础加密组件--Coder(测试代码)