OpenDDS开发手册---第二章(开始)5

来源:互联网 发布:去年淘宝双11销售额 编辑:程序博客网 时间:2024/03/29 14:37

2.2 数据处理优化

2.2.1 在发布者中注册并使用实例

    前面的示例隐式指定它通过示例数据发布的实例字段.当调用 write () 时, 数据编写器查询示例的键字段以确定实例。发布者还可以选择通过调用register_instance () 在数据写入者上:
Messenger::Message message;
message.subject_id = 99;
DDS::InstanceHandle_t handle =
message_writer->register_instance(message);
    在我们填充消息结构后, 我们调用 register_instance () 函数来注册实例。该实例由 subject_id 值99标识 (因为我们先前将该字段指定为键)。
    在发布示例时, 我们可以稍后使用返回的实例句柄:
DDS::ReturnCode_t ret = data_writer->write(message, handle);
    使用实例句柄发布示例的效率可能比强制写入者来查询实例, 并且在发布第一个示例时效率更高在第一个实例上。如果没有显式注册, 则第一次写入会导致资源分配OpenDDS 为该实例。
    由于资源限制可能导致实例注册失败, 因此许多应用程序考虑注册作为设置发布者的一部分, 并在初始化时始终执行数据写入者。

2.2.2 读取多个实例

dds 规范为读取和写入数据提供了许多操作样品.在上面的例子中, 我们使用了 take_next_sample () 操作, 来读取下一个样本, 并 "采取" 的所有权, 它从读者。Message数据读取器还具有下面进行操作。
·take ()-从读者中读取一个最大值为 max_samples 的序列
· take_instance ()-为指定的实例取值序列
· take_next_instance ()-取属于同一实例的样本序列,不指定实例
   还有一些 "read" 操作对应于这些 "take" 操作,获取相同的值, 但将示例保留在读取器中, 并简单地将它们标记为已读在SampleInfo中。
    由于这些其他操作读取了一系列值, 所以当样品快速到达。下面是一个示例调用 (), 它读取多达5示例时间
MessageSeq messages(5);
DDS::SampleInfoSeq sampleInfos(5);
DDS::ReturnCode_t status =
message_dr->take(messages,
sampleInfos,
5,
DDS::ANY_SAMPLE_STATE,
DDS::ANY_VIEW_STATE,
DDS::ANY_INSTANCE_STATE);

三状态参数可能专门针对哪些示例返回读者.有关其用法的详细信息, 请参阅 dds 规范。

2.2.3 零拷贝读取

    返回样本序列的读取和执行操作为用户提供获取样本副本的选项 (单次拷贝读取) 或对样本的引用(零拷贝读取)。零拷贝读取可以显著提高性能单次拷贝读取大样本类型。测试表明, 样品的8KB 或更少通过使用零拷贝读取不会获得太多好处, 但是对于使用对小样本进行零拷贝。
    应用程序开发人员可以指定使用零拷贝读取优化, 方法是调用take () 或read () 以零 max_len为0 构造的样本序列。Message序列和示例信息序列构造函数都将 max_len 作为它们的第一个参数, 并指定默认值为零。下面的代码示例取自
DevGuideExamples/DCPS/Messenger_ZeroCopy/DataReaderListenerImpl.cpp:
Messenger::MessageSeq messages;
DDS::SampleInfoSeq info;
// get references to the samples (zero-copy read of the samples)
DDS::ReturnCode_t status = dr->take(messages,
info,
DDS::LENGTH_UNLIMITED,
DDS::ANY_SAMPLE_STATE,
DDS::ANY_VIEW_STATE,
DDS::ANY_INSTANCE_STATE);

    在两个零拷贝采取或读和单采取或读之后, 样品和信息序列的长度设置为读取的样本数。对于零拷贝读取,max_len 设置为value >= length。
    由于应用程序代码要求对数据进行零拷贝贷款, 因此它必须返回贷款完成后的数据:

dr->return_loan(messages, info);

    调用 return_loan () 会导致序列的 max_len 被设置为 0, 其拥有成员设置为 false, 允许将相同的序列用于另一个零拷贝读取。
   如果数据示例序列构造函数和信息序列的第一个参数构造函数被更改为大于零的值, 则返回的示例值将是副本。当复制值时, 应用程序开发人员可以选择调用return_loan (), 但不要求这样做。
    如果未指定序列构造函数的 max_len (第一个) 参数, 则默认到 0;因此, 使用零拷贝读取。由于此默认值, 序列将自动调用return_loan (), 当它被摧毁。符合 dds 规范并可移植到 dds 的其他实现, 应用程序不应依赖于此自动return_loan () 功能。
  示例和信息序列的第二个参数是可用的最大插槽序列。如果take() 或read() 操作的 max_samples 参数大于此值, 则take() 或read() 返回的最大样本数将受此限制序列构造函数的参数。
    尽管应用程序可以更改零拷贝序列的长度, 但通过调用length (len) 操作, 建议您不要这样做, 因为此调用会导致复制数据, 并创建一个单次拷贝序列的样本。







原创粉丝点击