我必须做反射和后期绑定,所以我不知道是否有办法加快速度。 以为我会试一试。
此片段大约需要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);
}
}
答案 0 :(得分:3)
我假设15s是在循环中使用的;反射不是 慢。
您可以通过获取MethodInfo并使用Delegate.CreateDelegate 一次来加速反射(并特别调用)。然后,缓存并重新使用生成的类型委托(与预期的呼叫签名匹配)。然后使用键入的委托Invoke。
注意无类型的委托调用很慢;它必须打字。也;你可以偷偷摸摸地使用带有额外(前导)参数的委托来针对一系列不同的对象调用实例方法,如果你需要每次调用更改目标对象。
对于更复杂的场景,Expression或DynamicMethod非常有用。
答案 1 :(得分:3)
看看Fasterflect - A Fast and Simple Reflection API和Fast Invoker他们已准备好使用解决方案并且有趣地学习。
如果您想以自己的方式前往检查文章:Dodge Common Performance Pitfalls to Craft Speedy Applications和Dynamically Compiled Lambdas vs. Pure Reflection
答案 2 :(得分:1)
尝试使用表达式树编译lambda并缓存lambda。我已经广泛利用这一点并取得了巨大的成功。
http://kohari.org/2009/03/06/fast-late-bound-invocation-with-expression-trees/