优化动态类型上的方法调用

本文关键字:方法 调用 动态 类型 优化 | 更新日期: 2023-09-27 17:53:46

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

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

我可以使用非常直观的符号从这个root_ 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);

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

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

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");

优化动态类型上的方法调用

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

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