2010-10-18 93 views
1

我必須做反射和後期綁定,所以我不知道是否有辦法加快速度。 以爲我會給它一個鏡頭。InvokeMember非常緩慢,無論如何要避免這種情況?

這段代碼大約需要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); 
    } 
} 
+6

A *單*調用InvokeMember絕對*不*花費15秒的反射開銷。你是否反覆調用'InvokeCall'?否則,到目前爲止,最可能的解釋是,無論你實際調用什麼方法都需要一段時間,你應該調查那邊的問題。 – 2010-10-18 18:14:07

+3

這種特殊方法在早期綁定時執行的速度有多慢? – 2010-10-18 18:14:46

+0

@Kirk啊,是的,它後來調用了一個相當大的方法,雖然它不會讓我介入,我會再看一點 – Spooks 2010-10-18 18:22:12

回答

3

我假設15s是在循環中使用時;反映不是慢。

您可以通過獲取MethodInfo並使用Delegate.CreateDelegate 一次來加速反射(特別是調用)。然後,您緩存並重新使用生成的鍵入的委託(匹配預期的呼叫簽名)。然後使用鍵入的委託調用。

注意無類型委託調用速度慢;它必須鍵入。也;如果您需要目標對象更改每個呼叫,則可以偷偷摸摸地使用具有額外(超前)參數的委託來針對一系列不同的對象調用實例方法。

對於更復雜的場景,Expression或DynamicMethod很有用。

相關問題