将不确定变为确定~老赵写的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,写操作写入到 ...
随机推荐
- urlrewrite的rule怎么写
一.正则表达式教程 常用正则如下: . 换行符以外的所有字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d ...
- (PMP)第7章-----项目成本管理
7.1 规划成本管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (进度管理计划, 风险管理计划) 3.事业环境因素 4.组织过程资产 1.专家判断 2.数据分析 3.会议 1.成本管理计 ...
- android-基础编程-ExpandableListview
ExpandableListView继承ListView,具有LIstVIew的基本功能.此外具有group/child,由组与子元素组成. 1.布局主要有是三个. a.主布局: <Expand ...
- 深度搜索优先(全排列)//本内容来自《啊哈!算法》或者英文名《Aha!Algorithms》)
package Mypackage; import java.util.Scanner; public class 全排列{ static int a[]=new int[10]; static ...
- 程序的流程控制-分支结构 if
1.分支结构:if语句 第一种格式: /* if(条件表达式){ 语句体; } 其它语句 */ public class IfDemo1{ public static void main(String ...
- Integer Array Ladder questions
1.这个题不难,关键在于把题目意思理解好了.这个题问的不清楚.要求return new length,很容易晕掉.其实就是return 有多少个单独的数. import java.util.Array ...
- 利用Go2Shell 实现 Mac Finder 直接shell端打开当前文件夹
Finder 窗口 ,点击下图所示的按钮(红色框内),即可打开Shell Terminal. 打开后,如图 用法 安装go2shell后,打开finder的application文件夹,找到go2sh ...
- 【算法】二叉查找树(BST)实现字典API
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- SqlSessionFactoryBean的构建流程
目的 此文的主旨在于梳理SqlSessionFactoryBean的初始流程,不拘泥于实现细节. 使用 SqlSessionFactoryBean的主要作用便是用来创建SqlSessionFactor ...
- Swift5 语言指南(七) 集合类型
Swift提供三种主要的集合类型,称为数组,集合和字典,用于存储值集合.数组是有序的值集合.集是唯一值的无序集合.字典是键值关联的无序集合. Swift中的数组,集合和字典总是清楚它们可以存储的值和键 ...