2011-04-11 8 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; 
     } 
    } 
} 

、この行:(ロブConeryの巨大なクラスから)元のコード対

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

+1

測定してお知らせください。 – asawyer

+1

これはこれまで決して問題になることは決してありませんでしたが、そうした場合は、DBNull.Value.Equalsを呼び出しごとに100万回ループで呼び出すひどい悪意を持って作成されたアルゴリズムが原因です –

答えて

4

.NETリフレクタを見ると、DBNullオブジェクトにはフィールドがないことがわかります。常にDBNull(静的なValueフィールド)のインスタンスが1つあります。さらに、EqualsメソッドはDBNullクラスでオーバーライドされません。これは、Object.Equalsが呼び出され、参照の等価性をチェックする外部メソッド呼び出しを行うことを意味します。

結論:この呼び出しは2つのポインタを比較しており、パフォーマンスの影響はどんな状況でも問題になることはありません.2つの整数値を比較するようなものです。

+1

それは私が聞いて欲しかったことです、多くの多くのおかげでBas。 – Chaddeus

関連する問題