2011-04-11 50 views
2

我知道這可能不足以擔心,但DBNull.Value.Equals()檢查的性能如何?性能如何是DBNull.Value.Equals()檢查?

public IEnumerable<dynamic> Query(string sql, params object[] args) 
{ 
    using (var conn = OpenConnection()) 
    { 
     var rdr = CreateCommand(sql, conn, args).ExecuteReader(CommandBehavior.CloseConnection); 
     while (rdr.Read()) 
     { 
      var e = new ExpandoObject(); 
      var d = e as IDictionary<string, object>; 
      for (var i = 0; i < rdr.FieldCount; i++) 
       d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]); 
      yield return e; 
     } 
    } 
} 
特別

,這條線:

d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]); 

與原碼(從羅布科納的海量類):

d.Add(rdr.GetName(i), rdr[i]); 

有必然是至少一個小的衝擊,再次可能不是真正明顯的,但我很好奇。轉換的原因是因爲在ASP.NET MVC視圖中測試null更容易。

+0

做1000個查詢,時差 - 如果可以,我會感到驚訝 – BrokenGlass 2011-04-11 14:55:36

+1

衡量它並讓我們知道。 – asawyer 2011-04-11 14:55:47

+1

建議這永遠不會永遠成爲一個問題,如果確實如此,那將是因爲一個可怕的,惡意編寫的算法,每次調用都會在一個循環中調用DBNull.Value.Equals一百萬次 – 2011-04-11 15:06:48

回答

4

如果你看看.NET反射器,你可以看到一個DBNull對象沒有任何字段。總是有一個DBNull實例(靜態值字段)。此外,Equals方法在DBNull類中未被覆蓋。這意味着Object.Equals被調用,它會執行外部方法調用來檢查引用的相等性。

結論:這個調用比較兩個指針,性能影響在任何情況下都不會成爲問題,就像比較兩個整數值一樣。

+1

這就是我希望聽到的,很多人都感謝Bas。 – Chaddeus 2011-04-11 15:04:02