C#中判断空字符串的3种方法性能分析

来源:互联网 发布:c 定义可变长度数组 编辑:程序博客网 时间:2024/04/29 05:07

C#中判断空字符串的3种方法性能分析

3种方法分别是:
string a="";
1.if(a=="")
2.if(a==String.Empty)
3.if(a.Length==0)

3种方法都是等效的,那么究竟那一种方法性能最高呢?本人用实验说明问题。

建立3个aspx页面(为什么用网页,主要是利用Microsoft Application Center Test

WebForm1.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a=="")
    {
    }
   }
  }

WebForm2.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a==String.Empty)
    {
     
    }
   }
  }

WebForm3.aspx
private void Page_Load(object sender, System.EventArgs e)
  {
   string a="";
   for(int i=0;i<=1000000;i++)
   {
    if(a.Length==0)
    {
    }
   }
  }

 在Microsoft Application Center Test 下建立3个压力测试项目:

测试结果:

WebForm1.aspx----------if(a=="")


WebForm2.aspx-------if(a==String.Empty)


WebForm3.aspx-------if(a.Length==0)

所以3种方法量化的结果是98,105,168:
方法 结果 if(a=="") 98 if(a==String.Empty) 105 if(a.Length==0) 168

那么为什么if(a.Length==0)最快呢?
因为整数判断等于最快,没有经过实例化等复杂的过程。

所以:建议大家判断字符串是否为空用 if(a.Length==0)。

 ------------------------------------------------------------------------------

String.IsNullOrEmpty的源码:

public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}

 

VS2005 代码分析中,会给出如下提示。


警告 13 CA1820 : Microsoft.Performance : 使用 String.IsNullOrEmpty 调用替换“InSideUI.GetVideoPaginationSqlText(String, Int32, Int32):String”中对 String.op_Inequality(String.Empty) 的调用。 i:/wwwroot/App_Code/InSideUI.cs 74 http://localhost/
==================

很明显。微软的建议,用String.IsNullOrEmpty。

----------------------------------------------------------

#   excel06 发表于2007-04-28 11:46:45  IP: 58.34.253.*
对于三种方法的评价:

1.if(a=="") // ""需要实例化一个String对象,最差
2.if(a==String.Empty) // String.Empty是常量,不需要实例化
3.if(a.Length==0) // a.Length虽然最快,但是语意不如第2种清晰

另,String.IsNullOrEmpty(value)判断的是该字符串是非为空,或者为空字符串.

结论:推荐使用2.if(a==String.Empty),安全,稳定,语意清晰.

-----------------------------------------------------------

#   Hello 发表于2007-04-28 10:04:58  IP: 60.20.148.*
又一个误入歧途的程序员,而且还搞错了概念,csdn还放到首页,充分说明csdn的技术越来越烂,作为一个技术社区网站,页面竟然做的这么烂,还好意思出来

 

#   zzzzz 发表于2007-04-28 10:28:34  IP: 218.65.129.*
String.IsNullOrEmpty(value)


#   excel06 发表于2007-04-28 11:46:45  IP: 58.34.253.*
对于三种方法的评价:

1.if(a=="") // ""需要实例化一个String对象,最差
2.if(a==String.Empty) // String.Empty是常量,不需要实例化
3.if(a.Length==0) // a.Length虽然最快,但是语意不如第2种清晰

另,String.IsNullOrEmpty(value)判断的是该字符串是非为空,或者为空字符串.

结论:推荐使用2.if(a==String.Empty),安全,稳定,语意清晰.

 

 

#   全球 发表于2007-04-28 17:06:12  IP: 202.104.245.*
垃圾们,人家这样辛苦的研究是对学术一丝不苟的表现,学编程是细节化的东西,不是研究出了什么,而是一种研究的思路,以后如果遇到这样的问题楼主的做法自然有值得借鉴的地方 ,你们这些垃圾,不懂就别乱吹.
还有那个
if(a + ""=="")好像很牛似的,如果a是null,你的代码就没问吗??你用a+""其实就是多此一举,不但无效,反而误导人家,降低代码效率.


猪头们,醒醒吧,中国软件行业的未来靠你们!呵呵

 

#   全球 发表于2007-04-28 17:08:42  IP: 202.104.245.*
写代码为什么需要架构师和程序员呢??

架构师责任是设计优秀的软件架构.
程序员是编写优秀的代码.

你们到底站在什么样的角度看问题?是不是你们的角度都有问题啊?你说是不是?你敢说不是吗?

 

 


#   DeViLIvy 发表于2007-04-28 20:09:09  IP: 61.186.105.*
String.IsNullOrEmpty的源码:

public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}
-------------
我一般也用String.IsNullOrEmpty

 

#   abc 发表于2007-04-28 21:11:28  IP: 121.34.46.*
还是要支持以下楼主,很多写web出身的人不会理解这些优化的意义,但是如果写系统软件的话,这些优化有时是必不可少的。
举个例子:
将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。

 

#   未名 发表于2007-04-28 22:25:38  IP: 219.137.160.*
将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
那要怎么样才好啊

 

#   nov30th 发表于2007-04-29 00:41:51  IP: 60.186.190.*
===================================


简直阿!!!!!!


不知道作者有没有在项目作《〈〈〈代码分析〉〉〉》

----------------------------------------------------------------

 

VS2005 代码分析中,会给出如下提示。


警告 13 CA1820 : Microsoft.Performance : 使用 String.IsNullOrEmpty 调用替换“InSideUI.GetVideoPaginationSqlText(String, Int32, Int32):String”中对 String.op_Inequality(String.Empty) 的调用。 i:/wwwroot/App_Code/InSideUI.cs 74 http://localhost/
==================

很明显。微软的建议,用String.IsNullOrEmpty。

无知者无罪。

希望作者通过这些评论了解到真正的方法。

另外,建议你要求性能和稳定性上作文章,要经常进行“代码分析”来纠正错误。这是VS2005里面不错的一个功能。

 

#   phommy 发表于2007-04-29 09:05:51  IP: 218.57.140.*
VS2005 代码分析中```

请问一下,代码分析在哪个菜单里?我找遍了系统菜单也没找到...

 

#   fei0504 发表于2007-04-29 09:20:21  IP: 220.152.160.*
如果a=" "中间有好多空格呢?a.length还是0吗?

 

#   diandian82 发表于2007-04-29 12:11:16  IP: 131.107.0.*
一堆白痴啊,这种比较是很长用的,如果在大量的循环里面使用是非常能改善性能的,其实这个性能的差异我早知道,不过第一次看到楼主把他写出来,非常不错。

那些觉得没必要的,你们根本不是合格的程序员,如果世界上没有.net,你们是第一批被淘汰的程序员。都是被宠坏的孩子。

建议在学校先学学C++吧。

楼上那个更白痴,居然还问这种问题“如果a=" "中间有好多空格呢?a.length还是0吗?”

好好问问你自己吧

 

#   nnnd 发表于2007-04-29 12:42:06  IP: 203.86.30.*
>># 未名 发表于2007-04-28 22:25:38 IP: 219.137.160.*
>>将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
>>那要怎么样才好啊

用九个+号的话会造成产生9个临时的字符串对象,需要分配10次内存空间,垃圾回收器要回收9次。

当然先分配一段缓存,再把10个字符串复制过去啦,简单讲就是用StringBuilder或String.Join来并接

这些算是基础的知识了。

 

#   xiaobingyang 发表于2007-04-29 12:42:58  IP: 220.249.10.*
请使用中国人开发的C/C++编译器、网页浏览器内核
该软件下载地址:
http://www.nila.com.cn/yczip.zip
 

 

#   nnnd 发表于2007-04-29 12:44:54  IP: 203.86.30.*
对于楼主提到的 somevar.Length==0 的方法,基本上什么语言都是这样判断的,无论是vb6,java,.net,而不仅仅限制于c#,但是如果不是很确定somevar是否为null,使用 somevar==string.Empty也是一个不错的方法。

 

#   sunruping 发表于2007-04-29 13:00:09  IP: 61.237.230.*
大家的评价就不能中肯一点吗?楼主的思路是对的,别总是盯着这一点去看。

 

#   Xiang_Dui 发表于2007-04-29 13:14:14  IP: 218.20.56.*
>># 未名 发表于2007-04-28 22:25:38 IP: 219.137.160.*
>>将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
>>那要怎么样才好啊

用九个+号的话会造成产生9个临时的字符串对象,需要分配10次内存空间,垃圾回收器要回收9次。

当然先分配一段缓存,再把10个字符串复制过去啦,简单讲就是用StringBuilder或String.Join来并接

这些算是基础的知识了。

-------------------------------------------------------------------

如果 10 个小字符串是常量的话, 编译器会做优化, 编译时会合并成一个............ 不要将编译器看得这么烂...... 一般来说, 将一个大串分拆成几个小串来用"+"来连接, 目的是让代码容易读, 放在一行容易看得头晕.....

如果是变量的话, 那就要用 StringBuilder 或 String.Join....

 

 

#   henry 发表于2007-04-29 13:21:56  IP: 59.41.147.*
测试方式就用问题,ACT本身开销就很大,IIS开开销也很大。
如果都是在同一台PC上那这个结果根本没有可参考性,因为影响结果并不只是那个string操作的方法。
用.NET2.0的System.Diagnostics.Stopwatch进行测试一下吧.

 

#   smartstar2005 发表于2007-04-29 13:42:37  IP: 61.196.247.*
老大,你搞笑吧

你那样会死掉的

 

#   BlueTrees 发表于2007-04-29 13:49:59  IP: 60.176.207.*
string.lenght 语义是清晰的。

这没什么错,但是不太符合习惯。习惯是可以培养的。

空字符串的语义是长度为0的字符串,直接判断长度是没错的。

唯一的毛病就是null,null的语义是空对象,如果可以把空对象赋值给string类型,那么说明,string类型必须能够解释null类型含义。

null类型就是无类型,它不含字符串长度这样的定义。所以string对null进行解释的时候必须要进行类型匹配。如果把null解释成为长度为0的字符串也是不合理的。必须进行特殊的解释。

如果string对null进行了特殊的解释,那么使用长度来判断是否空字符的语义就是不正确的。

空字符串的语义就应当是,除了null之外长度为0的字符串,或者说具有长度属性但是为0的字符串。

增加一个判断就会增加一次开销,实际上在使用string.empty的时候,运算符重载的函数会进行null判断,然后判断长度。如果左侧的string为null就不会调用那个重载的运算符判断。

如果string.length判断增加了类型检查,那么效率等同于string.empty的判断。

之所以效率高,是因为TZ对空字符串的理解存在缺陷。

 

#   phommy 发表于2007-04-29 15:46:03  IP: 218.57.140.*
我为什么不用 String.IsNullOrEmpty:
因为这是一个静态函数,如楼上所说,用起来不习惯。
如果给出一个动态(静态的反义词是动态么?)重载,我肯定会用了

偏偏C#规定,点操作的左值必须不为null,即使它的类型确定也不可以。所以那个“动态”的重载是不可能写得出来的

所以,我还是按我从VB6里带来的习惯,用 str+""=="" 来进行比较,只是习惯而已。
而且,str+""的写法可以省掉非常非常多的 if 语句,谁用谁知道:)

 

#   danjiewu 发表于2007-04-30 09:00:39  IP: 221.224.33.*
String.IsNullOrEmpty是静态的,==就不是了?真搞笑。

lz的测试至少有2个问题:
用web测试误差太大,用控制台几句代码就可以为什么不用?
即使测试也要用if(a!=null && a.Length==0)来测,不等价的东西测了能说明什么?
 

 

#   PigLikeFly 发表于2007-04-30 09:14:27  IP: 124.42.30.*
呵呵, 看完博主的几个文章后, 被迫回忆那个经典的笑话:

高层掉下个木板, 砸死5个人, 有4个都是CSDN专家, 剩下那个是CSDN的编辑


CSDN里, 好东西越来越少了

 

#   yanzimywife_2005 发表于2007-04-30 10:32:41  IP: 122.48.126.*
现在的程序员真的是浮躁,LZ不过是共享一点自己的认识 有必要这么冷嘲热讽吗???
也些东西不是没有用而是在你的领域这个东西不需要关注,所以在你看来是没有用的,但你能保证以后这个东西对你来说都没有用吗??
这个东西当作一个知识储备,难道不行不?

 

#   Ar7_Top 发表于2007-04-30 11:00:54  IP: 210.13.115.*
>># 未名 发表于2007-04-28 22:25:38 IP: 219.137.160.*
>>将10个小字符串累加起来形成一条长字符串,如果你用了9个“+”号的话,那你的程序能卖出去才怪。
>>那要怎么样才好啊

用九个+号的话会造成产生9个临时的字符串对象,需要分配10次内存空间,垃圾回收器要回收9次。

当然先分配一段缓存,再把10个字符串复制过去啦,简单讲就是用StringBuilder或String.Join来并接

这些算是基础的知识了。
============================================
貌似雄台基础知识也不太行
如果是10个字符串相加的话,只要数量已知,性能就是很高的,并不会比StringBuilder差,甚至会因为分配小区内存和静态优化性能更好。使用StringBuilder的话适合不定量的字符串相加,或者是分多次累加。至于你说的垃圾收集的问题,StringBuilder并不会比String直接相加更加有优势,StringBuilder也是复制字符串里面的内容,它也不是链表

 

#   crazy7 发表于2007-04-30 13:25:02  IP: 123.52.10.*
怎么到处都是这种气氛,不是冷嘲热讽就是胡说八道,甚至破口大骂。连楼主发个帖子都遭此待遇,身为大菜鸟以后真的是不敢再说话了。

大家不能心平气和的说说吗?对说对的理由,错说错的道理,骂有何用?

 

#   dossystem 发表于2007-05-07 22:03:34  IP: 124.240.98.*
我觉得楼主写得不错.
关键是看你怎样去学.
 

 

#   lcyhjx 发表于2007-05-15 15:43:39  IP: 58.49.253.*
顶一个!!
这只是一个学习的示例!!
大家在这里就是交流的!!
可以发表不同的观点,但没必要带着情绪学习!

 

#   wg2809 发表于2007-05-17 09:39:22  IP: 219.149.220.*
非常感谢LZ!

 

#   bearhunter 发表于2007-05-19 18:58:23  IP: 125.115.13.*
感谢

 

#   maddemon 发表于2007-05-23 23:45:36  IP: 121.233.22.*
学习了!小弟刚刚学习ASP.NET
我判断是否为空的时候都是 If(str==null || str="") ...
看来我是最弱的。好像String.IsNullOrEmpty比较好


原创粉丝点击