在 DCOM 中传输记录的最快方式是什么

What is the fastest mean to transfer a record in DCOM

我想使用COM/DCOM在两台Windows PC 计算机之间传输具有以下结构的一些记录。我更喜欢一次传输一个数组,比如 TARec 的 100 个成员,而不是单独传输每个记录。目前我正在使用 IStrings 来做这件事。我希望使用原始记录对其进行改进,以节省 encode/decode 两端字符串的时间。请分享您的经验。

type
  TARec = record
    A : TDateTime;
    B : WORD;
    C : Boolean;
    D : Double;
  end;

所有记录的字段类型都是 OLE 兼容的。非常感谢。

正如 Rudy 在评论中建议的那样,如果您的数据包含简单的值类型,那么变体字节数组可能是一种非常有效的方法并且实现起来非常简单。

既然您已经声明您的数据已经存在于一个数组中,那么基本的方法是:

  1. 创建一个所需大小的字节数组来保存所有记录数据(使用 VarArrayCreate 类型 varByte

  2. 锁定数组以获得可安全用于引用内存中数组内容的指针(VarArrayLock 将锁定并且 return 指向数组数据的指针)

  3. 使用CopyMemory直接将数据从记录数组复制到字节数组内存。

  4. 解锁变体数组(VarArrayUnlock)并通过你的COM/DCOM接口

另一方面 ('receiving') 您只需反转过程即可:

  1. 声明所需大小的记录数组
  2. 锁定变体字节数组以获得指向保存字节的内存的指针
  3. 将字节数组数据复制到您的记录数组中
  4. 解锁字节数组

这种方法是我过去在非常苛刻的 COM/DCOM 场景 (w.r.t efficiency/performance) 中非常成功地使用的方法。

注意事项:

  • 如果您的数据发生变化以包含更复杂的类型,例如字符串或动态数组,则需要额外的工作才能通过字节数组正确传输这些类型。

  • 如果您的数据结构发生变化,那么界面 两边的代码都需要相应地更新。防止这种情况的一种方法是结合某种机制,以便接收方将数据识别为有效或无效。这可能包括一个“版本号”,例如 and/or 一个值(在 'header' 中作为字节数组的一部分,除了数组数据之外,或者作为一个单独的参数完全传递 - 精确的细节不真的很重要)。如果接收方发现它不期望的版本号或大小,那么它可以优雅地报告这一点,而不是天真地错误地处理数据并(很可能)导致崩溃或抛出异常。

  • Alignment/packing 问题。即使使用相同的记录类型声明,如果使用不同的对齐设置编译代码,那么内存中每条记录所需的大小可能会发生变化(这就是数据结构格式的“版本号”本身可能不可靠的原因).避免这种情况的一种方法是将记录声明为 packed,尽管这是以稍微降低效率为代价的(并且仍然依赖于接口双方同意数据结构是 packed).

然而,只有一些事情要记住,而不是规定性的。 complex/robust 您的实施方式将取决于您的具体情况。