2017-02-18 11 views
2

私はC#のAspect Oriented Libraryプロジェクトでリフレクションを使用します。いくつかの場所では、それは遅くなります。それから、私は記事を読んで、「直接呼び出しラッパーのバイトコードを生成することで、高速化された方法でリフレクションを一度使うことができます」と言います。これを行う方法は何ですか?この技術で珍しいのは何ですか?Reflectionを使ってダイレクトコールラッパーのバイトコードを生成する方法は?

+0

その記事をリンクできますか? –

+0

私は私の会社の本でこれを読んでいます。それはフレームワークを構築する方法のようでした。 「直接呼び出しラッパーのバイトコード」という言葉を検索すると、stackexchangeにもコメントがあります。 2番目のコメントでは、誰かがこの技術をも言及されたhttp://softwareengineering.stackexchange.com/a/123959。 – umtc

+0

基本的に、高度に最適化されたアスペクト指向のフレームワークを書くことを意味します。私はそれをお勧めしません、あなたのアプリケーションをロードするためにはるかに時間がかかるだろうと私はあなたが大幅にパフォーマンスを向上させることができるとは思わない。いくつかのプロファイリングテストを行い、コードがどこで遅くなるかを見てください。 –

答えて

1

これは、名義的な方法で物を洞察する代わりに、&を呼び出すのではなく、リフレクション/ジェネリック/生成コードを使用していつでも代理人を準備できることを意味します。

たとえば、オブジェクトをシリアル化するメソッドを記述する必要があるとします。

public class Serializer<T> 
{ 
    void Serialize(Stream stream, T value) 
    { 
     if (object.Equals(value, null)) { return; } 
     var type = typeof(T); 
     if (type == typeof(int)) { ... return ; } 
     if (type == typeof(string)) { ... return; } 
     var properties = type.GetProperties(); 
     foreach (property in properties) 
     { 
      var value = property.GetValue(value); 
      ... 
     } 
    } 
} 

この実装では、各呼び出しで反射を大量に使用して(この場合は)LINQの式を使用してデリゲートを作成するために使用され、一度だけヒットします

public class Serializer<T> 
{ 
    static private readonly Action<Stream, T> m_Serialize; 

    static Serializer() 
    { 
     Serializer<T>.m_Serialize = Expression.Lambda<Action<Stream, T>>(... [a lot of reflection here] ...).Compile(); 
    } 

    public void Serialize(Stream stream, T value) 
    { 
     Serializer<T>.Serialize(stream, value); 
    } 
} 

反射により変更することができます。

関連する問題