私はただいくつかのことをいじろうとしています。一種のOR/Mタイプのマッパーを作成しましたが、リフレクションを使用しているため、パフォーマンスが遅くなります。どうすればこれをスピードアップしたり、より良い、より効率的なアプローチを使用したりできますか?
名前付きパラメーターを持つカスタム属性があり、複数を許可してから、Reflectionを使用して次のことを行います。
- カスタム属性装飾が含まれているプロパティを取得します
- 見つかったプロパティごとに、カスタム属性データを取得します
- カスタム属性データごとに、名前付き引数を取得します
次に、名前付き引数memberinfo nameをチェックして、属性の問題の名前付きパラメーターと一致するかどうかを確認します。一致する場合は、その名前付きパラメーターに設定された値を取得し、最後にdataReaderからその名前付きパラメーター値のデータを読み取り、を使用します。 SetValueは、リーダーから読み取った値をプロパティに設定します。
ここにいくつかのコードがあり(完全ではありません)、誰かがそのパフォーマンスを改善する方法を教えてくれることを望んでいました。10,000回実行すると(これがJIT excersizeなどへの最初の呼び出しを実行する前に...)、次の平均時間が得られます。
3.79ms
手動で行う(つまり、DBからDTOへのハードコードされたマッピング):0.05ms
これは「別のOR/M」のようなものだと私は知っていますが、それはまったくそうではなく、何よりも私の楽しみのためです。
private T Populate<T>(IDataReader reader) where T : class, new()
{
T val = new T();
if (reader != null && !reader.IsClosed)
{
var propsWithSQLColumnNameAttributes = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static).Where(prop => Attribute.IsDefined(prop, typeof(SQLColumnNameAttribute)) && prop.CanWrite && prop.GetSetMethod() != null);
foreach (var currentProperty in propsWithSQLColumnNameAttributes)
{
foreach (var currentAttributeForProperty in currentProperty.GetCustomAttributesData())
{
string currentAttribParamValue = null;
foreach (var currentNamedArgument in currentAttributeForProperty.NamedArguments)
{
if (String.Equals(currentNamedArgument.MemberInfo.Name, SQLColumnNameAttribute.PropertyNames.DataColumnNamePropertyName, StringComparison.OrdinalIgnoreCase))
{
currentAttribParamValue = currentNamedArgument.TypedValue.Value == null ? null : currentNamedArgument.TypedValue.Value.ToString();
if (reader.DoesFieldExist(currentAttribParamValue))
{
var dbRecordValue = reader[currentAttribParamValue] == DBNull.Value ? null : reader[currentAttribParamValue];
currentProperty.SetValue(val, dbRecordValue, null);
}
break;
}
}
}
}
}
return val;
}
最高のコードではありませんが、それにもかかわらず、ここではperfが問題であり、リフレクションの別のアプローチを使用するか、使用されているアルゴリズムの順序と種類が正しくないために、パフォーマンスを改善する方法を知りたいと考えています。
どうもありがとう-この質問が理にかなっていることを願っています。