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

     以前曾经动笔写过一片《字符串比较方法的性能对比》的文章,很多朋友提出了非常好的意见和建议。碰巧最近看到好多人在这样比较字符串
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速度和性能上有明显的提升,只不过是旗鼓相当。不知道后续会有什么进展。
posted @ 2008-02-26 17:07  大约在冬季  阅读(3292)  评论(3编辑  收藏  举报