再谈两种不同字符串比较方法的性能对比

本文通过实验对比了四种不同的字符串比较方法的性能,包括使用“==”运算符、String.Compare方法等,并针对字符串长度一致和不一致的情况进行了测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     以前曾经动笔写过一片《 字符串比较方法的性能对比》的文章,很多朋友提出了非常好的意见和建议。碰巧最近看到好多人在这样比较字符串
if  ( string .Compare(keyState,  " M " true , CultureInfo.InvariantCulture)  ==   0 ) {
似乎很有意思,大家都喜欢另辟蹊径的使用字符串比较,为了较为客观的反应各种字符串比较的优势,我特地做了一个本地测试,分别区分字符串长度一致以及长度不一致的情况,另外每种情况下还对字符串的比较方式上使用4种不同方法:
1、使用地球人都知道的“==”比较运算符
2、使用String.Compare方法,即上面提到的代码
3、使用string.Equals(string, StringComparison.Ordinal)方法
4、使用string.Equals(a, b, StringComparison.OrdinalIgnoreCase)方法
当然第三种方法是在不区分大小写和语言区域的情况下,每次进行1K万次比较。首先来看第一种场景,即字符串长度一致,但是内容不一致的情况。
使用比较的字符串用例为:
 string a = "abcdefghigklmnopqrstuvwxyz0123457689";
 string b = "abcdefghigklmnopqrstuv0123wxyz457689";

1、“==” :0.3239秒
2、使用String.Compare方法:1.8457秒
3、使用string.Equals(a, b, StringComparison.OrdinalIgnoreCase)方法 :1.6891秒
4、使用a.Equals(b, StringComparison.OrdinalIgnoreCase)方法 :1.6764秒

使用比较的字符串用例为:
 string a = "abcdefghigklmnopqrstuvwxyz0123457689字符串比较方法";
 string b = "abcdefghigklmnopqrstuvwxyz0123457689字符比较方法";

1、“==” :0.1766秒
2、使用String.Compare方法:.3.1811秒
3、使用string.Equals(a, b, StringComparison.OrdinalIgnoreCase)方法 :0.1093秒
4、使用a.Equals(b, StringComparison.OrdinalIgnoreCase)方法 :0.1112秒
比较的示例代码如下:
1  Stopwatch watch  =   new  Stopwatch();
2              watch.Start();
3               for  ( int  i  =   0 ; i  <   10000000 ; i ++ ) {
4                   int  r  =  String.Compare(a, b,  true , CultureInfo.InvariantCulture);
5              }
6              watch.Stop();
7               double  time;
8              time  =  watch.Elapsed.TotalSeconds;
9              Console.WriteLine( " String.Compare  costs  {0} " , time);
从比较的结果来看,使用最常用的“==”判断还是很有优势的,至少在各方面可以找到一个平衡点。在第二个场景中之所以第3、4测试方法比直接用“==”判断快的原因是,测试方法3,4首先检查了字符串的长度,如下代码:
 1  case  StringComparison.OrdinalIgnoreCase:
 2               if  (a.Length  !=  b.Length)
 3              {
 4                   return   false ;
 5              }
 6               if  (a.IsAscii()  &&  b.IsAscii())
 7              {
 8                   return  (nativeCompareOrdinal(a, b,  true ==   0 );
 9              }
10               return  (TextInfo.CompareOrdinalIgnoreCase(a, b)  ==   0 );
11 
虽然有的书籍中介绍第4中方法会很快,但是至少从实际测试上来看却不是这样。此外,在进行WCF的WebService1.0的测试中并没有向微软宣称的那样比不是用WCF速度和性能上有明显的提升,只不过是旗鼓相当。不知道后续会有什么进展。

转载于:https://www.cnblogs.com/DreamWinter/archive/2008/02/26/1082575.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值