让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较
重构背景及原因
最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势。考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提高效率,同时也能培养阶梯人才。各个小分队为了“统一”代码风格,提高成员的代码能力以便最终能提高项目代码质量,减少以后的维护成本,最终决定“每日”进行小组内的代码走查/审查(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取代直接比较与非比较的更多相关文章
- 代码重构与单元测试——使用“以查询取代临时变量”再次对Statement()方法进行重构(七)
代码重构与单元测试(一) 代码重构与单元测试--测试项目(二) 代码重构与单元测试--"提取方法"重构(三) 代码重构与单元测试--重构1的单元测试(四) 代码重构与单元测试--对 ...
- 05_动手动脑之String.equals()方法的实现代码
Question: 请查看String.equals()方法的实现代码,注意学习其实现方法. Answer: java中的String.equals()方法的实现代码: equals()法是根类Obj ...
- C#、.Net代码精简优化(空操作符(??)、as、string.IsNullOrEmpty() 、 string.IsNullOrWhiteSpace()、string.Equals()、System.IO.Path 的用法)
一.空操作符(??)在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空值或是一个指定的值.通常我们会这样来处理: .string name = value; if (name ...
- 动手动脑之查看String.equals()方法的实现代码及解释
动手动脑 请查看String.equals()方法的实现代码,注意学习其实现方法. 第一个是false,后三个是true. package stringtest; public class Strin ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换
前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十一) 代码重构使用反射工厂解耦
前言 自从此博客发表以及代码开源以来,得到了许多人的关注.也没许多吧,反正在我意料之外的.包括几位大牛帮我做订阅号推广,真的很感谢他们.另外,还有几个高手给我提了一些架构上的问题.其实本身这个项目是没 ...
- 一次项目代码重构-使用spring容器干掉条件判断
一次项目代码重构-使用spring容器干掉条件判断 这是在一次公司项目中进行重构时,一些复杂业务时想到的一个去掉一些if else的办法.能够使代码逻辑更加清晰,减少一些业务上的耦合. 业务说明 我所 ...
- 0.1---selenium+java自动化测试进阶02----项目实战之登录代码重构
一.测试登录功能实现 以慕课网的登录为例,分析登录的功能需求,编写测试用例,找到要定位的元素以及需要的操作,编写登录功能的测试代码.代码实现如下: public static void main(St ...
- String使用机制及string.equals()和==的区别(转)
http://904582819.blog.163.com/blog/static/11159282020127794456840/ equals方法和==的区别 首先大家知道,String既可以 ...
随机推荐
- Linux 安装Mono环境 运行ASP.NET(二)
一.安装libgdiplus 前面我们已经安装了apr.apr_util.pcre和httpd apache .现在我们来安装libgdiplus Libgdiplus是一个Mono库,用于对 ...
- JS获取URL参数
$(function () { var action = getUrlParam("action"); alert(action) }); //根据URL中的参数获取值 funct ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- 攻城狮在路上(陆)-- hadoop分布式环境搭建(HA模式)
一.环境说明: 操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 ...
- C# 图片无损压缩
/// <summary> /// 图像缩略图处理 /// </summary> /// <param name="bytes">图像源数据&l ...
- 用WinForm写的员工考勤项目!!!!!!
先说几句,作为一个还在学习的程序员,掌握的知识有限:但我利用自身所学,给一些像我一样还在学习的码农提供我的绵薄之力! 写的不好,但是尽力了,希望大牛指点.多多吐槽!!! 好了开始说项目需求: 实现新增 ...
- Python 格式化输出
转载 今天写程序又记不清格式化输出细节了--= =索性整理一下. 注意: 与C/C++ 不同的是这里括号后面不需要加' , '号. python print格式化输出. 1. 打印字符串 print ...
- Eclipse '/RemoteSystemsTempFiles'错误
错误代码 Could not write metadata for '/RemoteSystemsTempFiles'.D:\workspace4.5\.metadata\.plugins\org.e ...
- c语言文件读写操作总结
C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...