最初接觸C#時就一直疑惑,比較字符串的方法:“Equals”與“==”在比較時性能有什么區別呢?相信這個問題也曾困惑着許多人,那么我們就一起來探討下:
比較一個string是否等於一個值,最初接觸C#的人會這么寫:
string
myStr =
"value"
;
if
(myStr.Equals(
"value"
))
{
}
if
(myStr ==
"value"
)
{
}
|
然后,會有人笑你很菜,得知把要判斷的value寫在前面性能高些,要這樣寫:
string
myStr =
"value"
;
if
(
"value"
.Equals(myStr))
{
}
if
(
"value"
== myStr)
{
}
|
但或許他也只是從那個笑他很菜的前輩那里得知應該這樣寫,而正確與否、差別,沒有真正自己去測試過。這里先不告訴大家上面“前輩”說的正確與否,我們來測試下:
public
class
Program
{
public
static
void
Main(
string
[] args)
{
int
time = 100000000;
int
start, end, i;
bool
result;
string
myStr =
"that's funny"
;
Console.Title =
"Equals & == test"
;
////////////////////////////////////////////////////////////////
// True test 1 - string.Equals("value")
////////////////////////////////////////////////////////////////
// 獲取程序開始后經過的毫秒數
start = System.Environment.TickCount;
// 判斷一次是否相等幾乎不需要時間,所以我們讓計算機判斷一億次,
// 這真是個天文數字,囧
for
(i = 0; i < time; i++)
{
result = myStr.Equals(
"that's funny"
);
}
// 這里得到的就是用Equals方法時距離程序啟動的毫秒數
// 因此,只要用end減去start除以1000便是Equals方法所花費的秒數
end = System.Environment.TickCount;
Console.WriteLine(
"True test 1 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// True test 2 - "value".Equals(string)
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result =
"that's funny"
.Equals(myStr);
}
end = System.Environment.TickCount;
Console.WriteLine(
"True test 2 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// True test 3 - string == "value"
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result = myStr ==
"that's funny"
;
}
end = System.Environment.TickCount;
Console.WriteLine(
"True test 3 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// True test 4 - "value" == string
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result =
"that's funny"
== myStr;
}
end = System.Environment.TickCount;
Console.WriteLine(
"True test 4 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// False test 1 - string.Equals("value")
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result = myStr.Equals(
"that's fun"
);
}
end = System.Environment.TickCount;
Console.WriteLine(
"False test 1 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// False test 2 - "value".Equals(string)
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result =
"that's fun"
.Equals(myStr);
}
end = System.Environment.TickCount;
Console.WriteLine(
"False test 2 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// False test 3 - string == "value"
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result = myStr ==
"that's fun"
;
}
end = System.Environment.TickCount;
Console.WriteLine(
"False test 3 cost time: "
+ (end - start) / 1000.0 +
" s"
);
////////////////////////////////////////////////////////////////
// False test 4 - "value" == string
////////////////////////////////////////////////////////////////
start = System.Environment.TickCount;
for
(i = 0; i < time; i++)
{
result =
"that's fun"
== myStr;
}
end = System.Environment.TickCount;
Console.WriteLine(
"False test 4 cost time: "
+ (end - start) / 1000.0 +
" s"
);
Console.ReadLine();
}
}
|
上面通過8個小測試,逐一計算了各種寫法在當判斷結果為true與false情況下花費的時間,下面是運行5次所得到的結果:
下面列出5次測試結果的對比:
true測試最快方式 | true測試最快方式與第二名的差距 | false測試最快方式 | false測試最快方式與第二名的差距 | |
測試1 | "value" == string | 0.046 s | "value".Equals(string) | 0.016 s |
測試2 | "value" == string | 0.219 s | "value".Equals(string) | 0.036 s |
測試3 | string == "value" | 0.015 s | "value".Equals(string) | 0.001 s |
測試4 | string == "value" | 0.068 s | string.Equals("value") | 0.021 s |
測試5 | string == "value" | 0.066 s | "value".Equals(string) | 0.001 s |
true測試:"value" == string領先總時間為0.265秒,string == "value"領先總時間為0.149秒;
false測試:"value".Equals(string)領先總時間為0.054秒,string.Equals("value")領先總時間為0.021秒。
現在我們暫時可以得到的結論是:true判斷時,用"value" == string是最快的;false判斷時,用"value".Equals(string)是最快的。
也就是說:一個判斷true發生的情況多些時,用"value" == string;false發生的情況多些時,用"value".Equals(string)。