重构背景及原因

  最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势。考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提高效率,同时也能培养阶梯人才。各个小分队为了“统一”代码风格,提高成员的代码能力以便最终能提高项目代码质量,减少以后的维护成本,最终决定“每日”进行小组内的代码走查/审查(Code Review),然后进行代码重构。

直接比较与非比较:我所谓的直接比较与非比较是指"=="判断方式与"!="判断方式,如以下代码

  public static void 直接判断()
{
Stopwatch timer = new Stopwatch();
timer.Start(); string str = "测试字符串";
for (int i = ; i < ; i++)
{
Stopwatch timer2 = new Stopwatch();
timer2.Start();
for (int j = ; j < ; j++)
{
if ("测试字符串" == str)
{
}
}
timer2.Stop();
Console.WriteLine("直接判断第" + i + "次耗时:" + (timer2.ElapsedMilliseconds)); }
timer.Stop();
Console.WriteLine("直接判断平均耗时:" + (timer.ElapsedMilliseconds * 1.0 / )); } public static void 非判断()
{
Stopwatch timer = new Stopwatch();
timer.Start(); string str = "测试字符串";
for (int i = ; i < ; i++)
{
Stopwatch timer2 = new Stopwatch();
timer2.Start();
for (int j = ; j < ; j++)
{
if ("测试字符串" != str)
{ }
}
timer2.Stop();
Console.WriteLine("非判断第" + i + "次耗时:" + (timer2.ElapsedMilliseconds)); }
timer.Stop();
Console.WriteLine("非判断平均耗时:" + (timer.ElapsedMilliseconds * 1.0 / )); }

  看到这里时有的朋友会说这有什么好说的呀,这又没什么影响,效果不一样么?那么我们看下以上代码执行结果吧,执行结果如下图:

  看到这张图时,可能有些朋友就笑了说,这差别也“忒大了”吧,10000000次才相差2.6毫秒呀,这有意思么?还好意思在这儿写。只是我觉得既然有性能上的差异的话,我们为什么不用好的哪一个呢?

  在此感谢园友“小彬”指出string.Equals的性能更好,然后经过我的测试,测试结果如下:

耗时情况: string.Equals< == <  !=

总结:在做字符串比较判断是优先考虑  string.Equals 。

  还是那句话,如果我们在写代码的时候就考虑到了这些我们还需要再花时间做此种重构么?代码重构怎能不渐行渐远呢?

以下是系列文章链接:

让代码重构渐行渐远系列(1)——解除多层嵌套

让代码重构渐行渐远系列(2)——降低代码重复度

让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较

让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较的更多相关文章

  1. 代码重构与单元测试——使用“以查询取代临时变量”再次对Statement()方法进行重构(七)

    代码重构与单元测试(一) 代码重构与单元测试--测试项目(二) 代码重构与单元测试--"提取方法"重构(三) 代码重构与单元测试--重构1的单元测试(四) 代码重构与单元测试--对 ...

  2. 05_动手动脑之String.equals()方法的实现代码

    Question: 请查看String.equals()方法的实现代码,注意学习其实现方法. Answer: java中的String.equals()方法的实现代码: equals()法是根类Obj ...

  3. C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)

    一.空操作符(??)在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空值或是一个指定的值.通常我们会这样来处理: .string name = value; if (name ...

  4. 动手动脑之查看String.equals()方法的实现代码及解释

    动手动脑 请查看String.equals()方法的实现代码,注意学习其实现方法. 第一个是false,后三个是true. package stringtest; public class Strin ...

  5. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

    前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...

  6. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十一) 代码重构使用反射工厂解耦

    前言 自从此博客发表以及代码开源以来,得到了许多人的关注.也没许多吧,反正在我意料之外的.包括几位大牛帮我做订阅号推广,真的很感谢他们.另外,还有几个高手给我提了一些架构上的问题.其实本身这个项目是没 ...

  7. 一次项目代码重构-使用spring容器干掉条件判断

    一次项目代码重构-使用spring容器干掉条件判断 这是在一次公司项目中进行重构时,一些复杂业务时想到的一个去掉一些if else的办法.能够使代码逻辑更加清晰,减少一些业务上的耦合. 业务说明 我所 ...

  8. 0.1---selenium+java自动化测试进阶02----项目实战之登录代码重构

    一.测试登录功能实现 以慕课网的登录为例,分析登录的功能需求,编写测试用例,找到要定位的元素以及需要的操作,编写登录功能的测试代码.代码实现如下: public static void main(St ...

  9. String使用机制及string.equals()和==的区别(转)

    http://904582819.blog.163.com/blog/static/11159282020127794456840/ equals方法和==的区别   首先大家知道,String既可以 ...

随机推荐

  1. 分布式之ZookeeperMac安装

    Zookeeper用于分布式计算中的协调员,观察员,观察者,分布式锁,在系统中利用Zookeeper来处理事件通知,队列,锁等功能. 使用brew安装 zookeeper. 可参考:http://bl ...

  2. Python-模块的使用

    基础概念 - 模块是Python组织代码的基本方式 - 一个Python脚本可以单独运行,也可以导入到另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module) - 所有的.py文件都可以 ...

  3. 整理:深度学习 vs 机器学习 vs 模式识别

    http://www.csdn.net/article/2015-03-24/2824301 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等) http://developer ...

  4. flume+kafka+spark streaming整合

    1.安装好flume2.安装好kafka3.安装好spark4.流程说明: 日志文件->flume->kafka->spark streaming flume输入:文件 flume输 ...

  5. web.xml文件加载顺序

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  6. Ue4的UE_LOG

    说明:本文为Wiki上的RAMA大神文章的大致翻译 游戏模式: 在游戏模式下,你需要在游戏的快捷方式后面加 -Log,才会在游戏中显示. 编辑器模式(Play In Editor): 你可以在Outp ...

  7. 前端CSS规范整理_转载、、、

    一.文件规范 1.文件均归档至约定的目录中. 具体要求通过豆瓣的CSS规范进行讲解: 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用U ...

  8. SOAPUI使用教程-入门REST测试

    首先,通过选择文件菜单中的“新建REST项目”选项创建从文件菜单中一个新的REST项目: 指定服务端点场下谷歌地图API网址: http://maps.googleapis.com/maps/api/ ...

  9. [转] nodemon 基本配置与使用

    在开发环境下,往往需要一个工具来自动重启项目工程,之前接触过 python 的 supervisor,现在写 node 的时候发现 supervisior 在很多地方都有他的身影,node 也有一个 ...

  10. mysql中生产表格多列统计问题

    for Example: select date_format(date,'%Y-%m-%d') as day, count(case when xinghao='a' then 1 end) as  ...