最近比较关注C#书写出来的代码性能问题,越研究就越觉得很有意思。
在日常的编程过程总,由于编程需要,我们经常会比较两个字符串是否相等,然后再做相应的处理。代码书写起来是觉得很爽,不是吗?if (a==b) then ……else……但是有没有更快的方式呢?为此查阅了一些资料了MSDN文档。当我们调用 a==b的时候,通过IL代码可以看到内部实际上调用了String.Equals(string,string)这个方法
IL_0021: call
bool
[mscorlib]System.String::op_Equality(
string
,
string
)
IL_0026: stloc.s re
public
static
bool
Equals(
string
a,
string
b)
{
if (a == b)
{
return true;
}
if ((a != null) && (b != null))
{
return EqualsHelper(a, b);
}
return false;
}

答案是有的。
.Net 2.0中新增了一个 StringComparison枚举类型,实际上我们大多数的字符串比较是和语言别无关的,我们应该使用Ordinal和OrdinalIgnoreCase两个枚举值。处于性能考虑,在字符串比较时不应该直接使用==操作符,而应该使用
bool Equals(string value, StringComparison comparisonType)
bool Equals(string a, string b, StringComparison comparisonType)
为此,我进行了一个测试,看看不等的==操作符和String.Equals方法之间的性能差别有多大。
测试代码:
string
a
=
"
abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+
"
;
string
b
=
"
abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+?
"
;
Stopwatch watch
=
new
Stopwatch();
watch.Start();
for
(
int
i
=
0
; i
<
90000000
; i
++
)
{
bool re = a.Equals(b, StringComparison.OrdinalIgnoreCase);
}
watch.Stop();
double
time
=
watch.Elapsed.TotalSeconds;
Console.Write(time);
Console.ReadLine();
然后运行下面的代码:
string
a
=
"
abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+
"
;
string
b
=
"
abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+?
"
;
Stopwatch watch
=
new
Stopwatch();
watch.Start();
for
(
int
i
=
0
; i
<
90000000
; i
++
)
{
bool re = (a == b);
}
watch.Stop();
double
time
=
watch.Elapsed.TotalSeconds;
Console.Write(time);
Console.ReadLine();
算出平均值之后,两者在速度上相差46.675%。
呵呵,差别惊人阿!
本文探讨了C#中字符串比较的性能问题,通过对比不同的字符串比较方式,发现使用String.Equals方法结合StringComparison枚举能显著提高性能。

被折叠的 条评论
为什么被折叠?



