优化方法调用动态类型(Optimising Method Calls on Dynamic Type

2019-10-19 16:28发布

我有以下的代码实例化一个注册的COM对象

private dynamic server = null // Global variable.
...
Type type = Type.GetTypeFromProgID("Svr.GrpCall");
this.server = Activator.CreateInstance(type);

我可以调用这个COM /方法dynamic蛮好用很直观的符号对象

string expectedResult = this.server.GroupInit(someString, someBoolean);

对于单电话呼叫通过动态语言运行时(DLR)这些方法的性能是宜居。 然而,对于一个要求,我需要使用双for环路成千上万的记录,它使用一个方法,返回COM对象void

for (int i = 0; i < MAXREC; i++)
    for (int j = 0; j < MAXFIELDS; j++)
        this.server.MakeRecord(s1, s2, str);

这是大规模慢。 我意识到这一点,埃里克利珀的回答https://stackoverflow.com/a/7480977/626442给出了这样的性能瓶颈的确切原因。

为了解决这个问题我试图定义一个全局ActionMakeRecord方法是在压力下

private Action<short, short, string> makeRecord;

其中,该计划是在上使用此for循环。 使用此之前Action ,我试图第一初始化服务器(如上所述),然后将分配makeRecord使用代表到COM方法

Type type = Type.GetTypeFromProgID("Svr.GrpCall");
this.server = Activator.CreateInstance(type);

MethodInfo methodInfo = type.GetMethod("MakeRecord");
makeRecord = (Action<short, short, string>)Delegate.CreateDelegate(type, methodInfo);

type.GetMethod("MakeRecord")将返回null 。 所以,我的问题是,

  1. 如果这加快我的右边方法 dynamic调用,我怎么能在COM方法分配MakeRecord到我的Action代表?

  2. 如果这不是加快我的右边方法 dynamic调用,究竟是什么?

谢谢你的时间。


我也试着这样做

object o = Activator.CreateInstance(type);
MethodInfo methodInfo = o.GetType().GetMethod("MakeRec");

Answer 1:

你怎么知道的缓慢行为是由于使用的dynamic

  • 您是否尝试过(即不使用使用强类型的托管包装的COM接口,并直接打电话给他们dynamic ,并且不使用任何反射方法)? 您可以添加一个引用的COM组件自身来自动创建托管包装。
  • 您是否尝试过运行调试器外部的代码? 用于方法1的性能损失调用本机代码,其包括COM接口的调用:在高达100运行在调试器的结果的代码。
  • 你有没有考虑更新接口方面提供了更直接的实现所需的算法,这样你可以在托管代码较少的函数调用?


文章来源: Optimising Method Calls on Dynamic Type