让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较
重构背景及原因
最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势。考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提高效率,同时也能培养阶梯人才。各个小分队为了“统一”代码风格,提高成员的代码能力以便最终能提高项目代码质量,减少以后的维护成本,最终决定“每日”进行小组内的代码走查/审查(Code Review),然后进行代码重构。
直接比较与非比较:我所谓的直接比较与非比较是指"=="判断方式与"!="判断方式,如以下代码
1 public static void 直接判断() 2 { 3 Stopwatch timer = new Stopwatch(); 4 timer.Start(); 5 6 string str = "测试字符串"; 7 for (int i = 0; i < 10; i++) 8 { 9 Stopwatch timer2 = new Stopwatch(); 10 timer2.Start(); 11 for (int j = 0; j < 10000000; j++) 12 { 13 if ("测试字符串" == str) 14 { 15 } 16 } 17 timer2.Stop(); 18 Console.WriteLine("直接判断第" + i + "次耗时:" + (timer2.ElapsedMilliseconds)); 19 20 } 21 timer.Stop(); 22 Console.WriteLine("直接判断平均耗时:" + (timer.ElapsedMilliseconds * 1.0 / 10)); 23 24 } 25 26 public static void 非判断() 27 { 28 Stopwatch timer = new Stopwatch(); 29 timer.Start(); 30 31 string str = "测试字符串"; 32 for (int i = 0; i < 10; i++) 33 { 34 Stopwatch timer2 = new Stopwatch(); 35 timer2.Start(); 36 for (int j = 0; j < 10000000; j++) 37 { 38 if ("测试字符串" != str) 39 { 40 41 42 } 43 } 44 timer2.Stop(); 45 Console.WriteLine("非判断第" + i + "次耗时:" + (timer2.ElapsedMilliseconds)); 46 47 } 48 timer.Stop(); 49 Console.WriteLine("非判断平均耗时:" + (timer.ElapsedMilliseconds * 1.0 / 10)); 50 51 }
看到这里时有的朋友会说这有什么好说的呀,这又没什么影响,效果不一样么?那么我们看下以上代码执行结果吧,执行结果如下图:
看到这张图时,可能有些朋友就笑了说,这差别也“忒大了”吧,10000000次才相差2.6毫秒呀,这有意思么?还好意思在这儿写。只是我觉得既然有性能上的差异的话,我们为什么不用好的哪一个呢?
在此感谢园友“小彬”指出string.Equals的性能更好,然后经过我的测试,测试结果如下:
耗时情况: string.Equals< == < !=
总结:在做字符串比较判断是优先考虑 string.Equals 。
还是那句话,如果我们在写代码的时候就考虑到了这些我们还需要再花时间做此种重构么?代码重构怎能不渐行渐远呢?
以下是系列文章链接:
让代码重构渐行渐远系列(1)——解除多层嵌套
让代码重构渐行渐远系列(2)——降低代码重复度
让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较