将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器
首先,非常感谢赵老大的CodeTimer,它让我们更好的了解到代码执行的性能,从而可以让我们从性能的角度来考虑问题,有些东西可能我们认为是这样的,但经理测试并非如何,这正应了我之前的那名话:“机器最能证明一切”!
费话就不说了,看代码吧:
1 /// <summary>
2 /// 执行代码规范
3 /// </summary>
4 public interface IAction
5 {
6 void Action();
7 }
8
9 /// <summary>
10 /// 老赵的性能测试工具
11 /// </summary>
12 public static class CodeTimer
13 {
14 [DllImport("kernel32.dll", SetLastError = true)]
15 static extern bool GetThreadTimes(IntPtr hThread, out long lpCreationTime, out long lpExitTime, out long lpKernelTime, out long lpUserTime);
16
17 [DllImport("kernel32.dll")]
18 static extern IntPtr GetCurrentThread();
19 public delegate void ActionDelegate();
20 private static long GetCurrentThreadTimes()
21 {
22 long l;
23 long kernelTime, userTimer;
24 GetThreadTimes(GetCurrentThread(), out l, out l, out kernelTime, out userTimer);
25 return kernelTime + userTimer;
26 }
27 static CodeTimer()
28 {
29 Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
30 Thread.CurrentThread.Priority = ThreadPriority.Highest;
31 }
32 public static void Time(string name, int iteration, ActionDelegate action)
33 {
34 if (String.IsNullOrEmpty(name))
35 {
36 return;
37 }
38 if (action == null)
39 {
40 return;
41 }
42
43 //1. Print name
44 ConsoleColor currentForeColor = Console.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 });
测试的结果如下:
aaarticlea/png;base64,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" alt="" />
从图中我们可以看到StringBuilder快的很明显,无论是执行时间,还是对CPU的消耗及GC回收都远低于String的拼结,所以,才有以下结论:
在字符串拼结时,请使用StringBuilder吧!
将不确定变为确定~老赵写的CodeTimer是代码性能测试的利器的更多相关文章
- 根据老赵轻量级Actor进行修改的Actor模型
学习了老赵轻量级Actor模型,并在实际中使用,效果不错. 老赵轻量级Actor模型: ActorLite:一个轻量级Actor模型实现(上) ActorLite:一个轻量级Actor模型实现(中) ...
- 老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html
老赵点滴地址:http://blog.zhaojie.me/2009/05/a-simple-actor-model-implementation.html
- python实现统计你一共写了多少行代码
程序员要保证一定的代码量就必须勤奋的敲代码,但怎么知道自己一共写了多少代码呢,笔者用python写了个简单的脚本,遍历所有的.java,.cpp,.c文件的行数,但是正如大家所知,java生成了许多代 ...
- 如何写出无法维护的代码(JAVA版)
程序命名(针对那些不能混淆的代码) 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, x,y,z,或者干脆上中文比如(阿隆索肯德基) 有创意地拼写错误.比如:SetPint ...
- 写出优质Java代码的4个技巧
我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都是可以满足目标的.然而,有的项目可能需要用到一些特别的技术,因此工程师们得深入研究,去寻找那些最简单但最 ...
- 写出优质Java代码的4个技巧(转)
http://geek.csdn.net/news/detail/238243 原文:4 More Techniques for Writing Better Java 作者:Justin Alban ...
- 用bochs调试自己写的系统引导代码
1 安装和配置bochs 首先从bochs.sourceforge.net里面把BOCHS给download下来,鉴于Windows的普及,仅仅谈BOCHS在win下的使用方法,其实在其它的OS中方法 ...
- 你写的什么垃圾代码让Vsync命令不能及时处理呢?(1)
想想自己写的什么垃圾代码导致Vsync不能及时处理#(不高兴) 想不开? 实际开发中性能问题不好复现?这你就可能需要一些工具来帮你检测这种情况. 首先是Android系统自带的工具(4.1之后的版本) ...
- Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback
Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback 上一篇# Linux Kernel文件系统写I/O流程代码分析(一),我们看到Buffered IO,写操作写入到 ...
随机推荐
- 《Linux就该这么学》第九天课程
这次课程主要学了如何分区以及RAID技术 有扩展分区:扩展分区可以指定sdb*中的*(1~4)为多少,则其他三个为主分区,扩展分区中的逻辑分区sdb*(*从5开始)无扩展分区:四个皆为主分区 RAID ...
- 学习Acegi应用到实际项目中(1)
在此,本人声明,我处于菜鸟阶段,文章的内容大部分摘自zhanjia的博客(http://zhanjia.iteye.com/category/43399),旨在学习,有很多地方,我理解不够透彻,可能存 ...
- tabel表格的dom操作
对table表格的操作比较麻烦,一直字符串的连接会比较麻烦 var nod = cwgk_msg_list.insertRow();//这个是上边获取过的dom元素,一般是tbody的元素,对元素进行 ...
- VirtualBox中的快捷键
VirtualBox中的快捷键 VirtualBox中的 Host 键默认是: Right Ctrl 键,意思是键盘上右边那个 “Ctrl”键. Host 键可以点击 Oracle VM Virtua ...
- 使用Python对Twitter进行数据挖掘(Mining Twitter Data with Python)
目录 1.Collecting data 1.1 Register Your App 1.2 Accessing the Data 1.3 Streaming 2.Text Pre-processin ...
- springMVC一个Controller处理所有用户请求的并发问题(转)
springMVC一个Controller处理所有用户请求的并发问题 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.一 ...
- CentOS 7安装新版RabbitMQ解决Erlang 19.3版本依赖
通过yum等软件仓库都可以直接安装RabbitMQ,但版本一般都较为保守. RabbitMQ官网提供了新版的rpm包(http://www.rabbitmq.com/download.html),但是 ...
- JavaScript概述-第1章
目录 初始JavaScript 学会使用编辑工具 如何引入脚本代码 常用语句 常见浏览器兼容性问题 了解前端开发技术JavaScript,JavaScript的发展,JavaScript特点,Java ...
- struts2框架学习笔记2:配置详解
核心配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC ...
- 闲话ajax,例ajax轮询,ajax上传文件[开发篇]
引语:ajax这门技术早已见怪不怪了,我本人也只是就自己真实的经验去总结一些不足道的话.供不是特别了解的朋友参考参考! 本来早就想写一篇关于ajax的文章的,但是前段时间一直很忙,就搁置了,趁着元旦放 ...