(轉)C#中“Equals”與“==”的速度比較


最初接觸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次所得到的結果:

2010-03-21 Sunday 007

下面列出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)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM