InvokeMember非常缓慢,无论如何要避免这种情况?

问题描述:

我必须做反射和后期绑定,所以我不知道是否有办法加快速度。 以为我会给它一个镜头。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

我假设15s是在循环中使用时;反映不是慢。

您可以通过获取MethodInfo并使用Delegate.CreateDelegate 一次来加速反射(特别是调用)。然后,您缓存并重新使用生成的键入的委托(匹配预期的呼叫签名)。然后使用键入的委托调用。

注意无类型委托调用速度慢;它必须键入。也;如果您需要目标对象更改每个呼叫,则可以偷偷摸摸地使用具有额外(超前)参数的委托来针对一系列不同的对象调用实例方法。

对于更复杂的场景,Expression或DynamicMethod很有用。

看看Fasterflect - A Fast and Simple Reflection APIFast Invoker他们准备好使用解决方案和有趣的研究。

如果你想通过自己的方式检查物品去:Dodge Common Performance Pitfalls to Craft Speedy ApplicationsDynamically Compiled Lambdas vs. Pure Reflection

尝试使用表达式树编译Lambda和缓存拉姆达。我广泛地利用了这一点,取得了巨大的成功。

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