0

私はただいくつかのことをいじろうとしています。一種の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が問題であり、リフレクションの別のアプローチを使用するか、使用されているアルゴリズムの順序と種類が正しくないために、パフォーマンスを改善する方法を知りたいと考えています。

どうもありがとう-この質問が理にかなっていることを願っています。

4

1 に答える 1

2

このページhttp://www.codeproject.com/Articles/503527/Reflection-optimization-techniquesを見て、それが役立つかどうかを確認してください。多くのシナリオでのリフレクションの最適化について説明しています。一度学びたいと思ったら、これは素晴らしいリソースになる可能性があります。

于 2013-01-05T14:51:24.480 に答える