8

組み込みのGetInt32ではなく、DataReaderからNullableInt32を返す単純なメソッドがあります。

私はこのメソッドを何度も呼び出していますが、いつでもそれを削ることができるという状況が1つあります。

DataReaderからnull許容のInt32を取得するための代替のより高速な方法を誰かが提案できますか?

private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
    return !dataReader.IsDBNull(fieldIndex) ? 
                dataReader.GetInt32(fieldIndex) : (Int32?)null;
}
4

2 に答える 2

11

値をオブジェクトとして取得し、それがDBNullであるかどうかを確認する方が、場合によっては高速になることを思い出しているようです。

private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
    object value = dataReader.GetValue(fieldIndex);
    return value is DBNull ? (Int32?) null : (Int32) value;
}

少なくとも試してみる価値はあります。これは、箱から出してすぐに開梱できることを前提としていることに注意してくださいint...それが正しいかどうかはわかりませんが、簡単に確認できます。

ここで、安全性がやや劣る別のアプローチがあります。たとえば、フィールドが実際に文字列であっても、整数以外の値に対してnullを返します。

private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
    return dataReader.GetValue(fieldIndex) as Int32?;
}

以前、null許容型が期待したほど高速ではない「as」について書きましたが、これは少し異なる場合があります...繰り返しになりますが、試してみる価値があります。

ただし、これが本当にボトルネックである場合は、本当に驚きます...そもそもデータベースからデータを取得するのは、はるかにコストがかかるでしょう。このためのベンチマークはありますか?

于 2010-07-15T08:57:54.273 に答える
2

最適化するコード(?:)は、周囲のI/Oと比較して重要ではありません。

ですから、これ以上速くなることはありません。

于 2010-07-15T09:00:30.927 に答える