在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近写了几篇《c#扩展方法奇思妙用》的文章,一直只是讨论如何扩展、如何使用的问题,几乎没有涉及效率方面。
而大家的回复好多都在问效率如何、性能怎样,也引起了我对效率的关注,今天将初步测试的结果发出来,大家一起探讨一下。 以前没太写过性能测试的代码,上网找了一下,说可以用Stopwatch进行计时,比较准确。 Stopwatch使用比较简单,几个方法从名字上就知道用用途:Reset(计时清零)、Start(开始计时)、Stop(停止计时),属性ElapsedMilliseconds就是执行操作所用的毫秒数。 为了简化测试,让更多人看明白,我们这是对IsNullOrEmpty扩展进行测试,它只是简单调用string.IsNullOrEmpty静态方法。 但为了让我们的测试更有趣一些,我们再加上两个相同功能的方法,一个是IsNullOrEmpty的手工实现版,称为手工方法,另外一个用lambda表达式写的。 一共是如下三个方法与string.IsNullOrEmpty(称为“原方法”)比较:
1 //扩展方法
2 public static bool IsNullOrEmpty1(this string s) 3 { 4 return string.IsNullOrEmpty(s); 5 } 6 //手工方法 7 public static bool IsNullOrEmpty2(string s) 8 { 9 return s == null || s == string.Empty; 10 } 11 //lambda方法 12 public static Func<string, bool> IsNullOrEmpty3 = s => string.IsNullOrEmpty(s); 我们在函数名后面添加上一个数字,将它们区分开,以避免相互混淆。
为了测试公正,尽量消除测试中的误差,我们采用一个数组存放要测试的字符串。 这个数组中存放三种字符串,非Empty非Null、Empty、Null。随机存入,数量大致相同。生成算法如下:
1 private static string[] GetTestStringArray(int count)
2 { 3 string[] result = new string[count]; 4 Random random = new Random(); 5 6 int r = 0; 7 for (int i = 0; i < count; i++) 8 { 9 r = random.Next(3); 10 if (r == 0) result[i] = i.ToString(); 11 else if (r == 1) result[i] = string.Empty; 12 else result[i] = null; 13 } 14 return result; 15 } 我们让这四个算法(前面三个算法+原来的静态算法)依次对数组中的每一项进行判断。
有一点要特别注意,对集合遍历也要耗时,我们要排除这段时间。 下面给出测试算法,写的不好,别见笑:
1public static void Test()
2 想重构一下,考虑了几种办法,不太好,怕重构后大家看起来更费力。
Test中的4个小段代码很相似,分别用来测量4个算法的用时。
1 foreach (string s in ss) str = s;
上面这句代码是基本循环,后面三组代码都在它基础上加入相应操作。 |
请发表评论