質問

私は反省と遅い結合をしなければならないので、物事をスピードアップする方法があるかどうかはわかりません。私はそれにショットを与えると思った。

このスニペットは完了するまでに約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);
    }
}
役に立ちましたか?

解決

私は15がループで使用される場合に想定しています。反射はそうではありません それ スロー。

MethodInfoを取得し、Delegate.createdElegateを使用することにより、リフレクションをスピードアップできます(特に呼び出します) 一度. 。次に、キャッシュして結果を再利用します タイプしました デリゲート(予想される通話署名の一致)。次に、タイプされたデリゲートの呼び出しを使用します。

ノートUntyped Delegate Invokeは遅いことです。タイプする必要があります。また;あなたは卑劣になり、追加の(リーディング)パラメーターを備えたデリゲートを使用して、 実例 さまざまなオブジェクトの範囲に対して、ターゲットオブジェクトが必要な場合は、1コールを変更する必要がある場合。

より複雑なシナリオには、式またはdynamicMethodが役立ちます。

他のヒント

見てください 高速化 - 高速でシンプルな反射API高速インボーカー 彼らはソリューションを使用する準備ができており、勉強するために興味深いものです。

自分の道で行きたい場合は、記事を確認してください。 迅速なアプリケーションを作成するための一般的なパフォーマンスの落とし穴をかわします動的にコンパイルされたラムダス対純粋な反射

ラムダをまとめた式ツリーを使用して、ラムダをキャッシュしてみてください。私はこれを大成功で広範囲に活用しました。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top