InvokeMember很慢,反正要避免这个?

时间:2010-10-18 18:12:07

标签: c# winforms performance reflection late-binding

我必须做反射和后期绑定,所以我不知道是否有办法加快速度。  以为我会试一试。

此片段大约需要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);
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

注意无类型的委托调用很慢;它必须打字。也;你可以偷偷摸摸地使用带有额外(前导)参数的委托来针对一系列不同的对象调用实例方法,如果你需要每次调用更改目标对象。

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

答案 1 :(得分:3)

看看Fasterflect - A Fast and Simple Reflection APIFast Invoker他们已准备好使用解决方案并且有趣地学习。

如果您想以自己的方式前往检查文章:Dodge Common Performance Pitfalls to Craft Speedy ApplicationsDynamically Compiled Lambdas vs. Pure Reflection

答案 2 :(得分:1)

尝试使用表达式树编译lambda并缓存lambda。我已经广泛利用这一点并取得了巨大的成功。

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