优化方法调用动态类型

时间:2014-03-26 14:05:16

标签: c# performance com dynamic-language-runtime

我有以下代码实例化已注册的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);

MASSIVELY 慢。我知道这一点,Eric Lippert的回答https://stackoverflow.com/a/7480977/626442给出了这个性能瓶颈的确切原因。

为了解决这个问题,我尝试为处于压力下的Action方法定义全局MakeRecord

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来电,那是什么?

  3. 感谢您的时间。


    我也尝试过做

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

1 个答案:

答案 0 :(得分:2)

您如何知道缓慢的行为是由于使用dynamic

  • 您是否尝试过为COM接口使用强类型托管包装并直接调用它们(即不使用dynamic而不使用任何反射方法)?您可以添加对COM程序集本身的引用,以自动创建托管包装程序。
  • 您是否尝试在之外的调试程序中运行代码?在调试器中运行代码导致对本机代码的方法调用(包括COM接口调用)的性能最高达到100:1。
  • 您是否考虑更新界面以提供所需算法的更直接实现,以便您可以在托管代码中减少函数调用?