InvokeMember ist sehr langsam, trotzdem dies zu vermeiden?
-
09-10-2019 - |
Frage
Ich habe Reflexion zu tun, und die späte Bindung, so dass ich weiß nicht, ob es einen Weg gibt, um Dinge zu beschleunigen. Dachte, ich würde es einen Schuss.
Dieser Code-Schnipsel dauert etwa 15 Sekunden abgeschlossen, welchen Weg zu langsam, aber zu sehen, wie ich brauche, um die Metadaten zu lesen.
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);
}
}
Lösung
Ich gehe davon aus, dass 15s wird, wenn in einer Schleife verwendet wird; Reflexion ist nicht , die langsam.
Sie können Reflexion (und invoke insbesondere) beschleunigen, indem die Method zu erhalten und mit Delegate.CreateDelegate einmal . Sie dann Cache und Wiederverwendung der resultierenden getippt Delegierten (die erwartete Anruf Signatur entspricht). Dann nutzen Sie die typisierten Delegaten aufrufen.
Hinweis nicht typisierten Delegaten invoke ist langsam; es muss eingegeben werden. Ebenfalls; Sie können einen Delegaten sein mit einem zusätzlichen (führenden) Parameter eine Instanz Verfahren gegen eine Reihe von verschiedenen Objekten hinterhältig und verwenden aufzurufen, wenn Sie das Zielobjekt zu ändern pro Anruf müssen.
Für komplexere Szenarien, Expression oder Dynamic sind nützlich.
Andere Tipps
Werfen Sie einen Blick auf Fasterflect - eine schnelle und einfache Reflection-API und Fast Invoker sie bereit sind, Lösungen zu verwenden und interessant zu studieren.
Wenn Sie möchten, indem Sie Ihre eigene Art und Weise Check Artikel gehen: Ausweichen gemeinsame Leistung Pitfalls Craft Speedy Anwendungen und
Versuchen Sie, einen Ausdrucksbaum zusammengestellt Lambda und cachen das Lambda verwenden. Ich habe dies ausgiebig genutzt mit großem Erfolg. http://kohari.org / 2009/03/06 / schnell spät gebundene-Aufruf-mit-Ausdruck-Bäume /