您的位置:首页 > 其它

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

2008-02-26 17:07 501 查看
以前曾经动笔写过一片《字符串比较方法的性能对比》的文章,很多朋友提出了非常好的意见和建议。碰巧最近看到好多人在这样比较字符串
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速度和性能上有明显的提升,只不过是旗鼓相当。不知道后续会有什么进展。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: