2

リフレクションと遅延バインディングを行う必要があるため、速度を上げる方法があるかどうかはわかりません。やってみようと思いました。

このスニペットが完了するまでに約 15 秒かかりますが、これは遅すぎますが、メタデータを読み取る必要があることを確認できます。

private static object InvokeCall(Type HostObjectType, Object HostObject, CallType callType, string PropertyOrMethodName, object[] args)
{
    if (callType == CallType.Method)
    {
        return MyObjectType.InvokeMember(PropertyOrMethodName,System.Reflection.BindingFlags.InvokeMethod, null, myObject, args);
    }
}
4

3 に答える 3

5

Fasterflect - A Fast and Simple Reflection APIFast Invokerを見てください。これらはソリューションを使用する準備ができており、研究するのに興味深いものです。

独自の方法で進みたい場合は、次の記事を確認してください: Dodge Common Performance Pitfalls to Craft Speedy Applications and Dynamically Compiled Lambdas vs. Pure Reflection

于 2010-10-18T18:31:16.623 に答える
4

ループで使用する場合は 15 秒だと思います。反射はそれほど遅くありません。

MethodInfo を取得し、 Delegate.CreateDelegate onceを使用することで、リフレクション (特に呼び出し) を高速化できます。次に、結果の型指定されたデリゲートをキャッシュして再利用します(予想される呼び出し署名と一致します)。次に、型指定されたデリゲート Invoke を使用します。

型指定されていないデリゲートの呼び出しは遅いことに注意してください。入力する必要があります。また; ターゲット オブジェクトを呼び出しごとに変更する必要がある場合は、こっそりとデリゲートを追加の (先頭の) パラメーターと共に使用して、さまざまなオブジェクトの範囲に対してインスタンスメソッドを呼び出すことができます。

より複雑なシナリオでは、Expression または DynamicMethod が役立ちます。

于 2010-10-18T18:18:28.450 に答える
1

式ツリーでコンパイルされたラムダを使用して、ラムダをキャッシュしてみてください。私はこれを大いに活用して大きな成功を収めました。

http://kohari.org/2009/03/06/fast-late-bound-invocation-with-expression-trees/

于 2010-10-18T18:40:24.020 に答える