2011-04-11 59 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