Fast-DDS的benchmark示例是一个用于测试DDS通信性能的工具,主要通过发布者(Publisher)和订阅者(Subscriber)之间的消息传输,验证不同配置下的吞吐量等性能指标。以下是代码结构和核心逻辑的梳理:
一、代码结构
示例位于Fast-DDS/examples/cpp/benchmark,主要文件及功能如下:
| 文件/目录 | 功能描述 |
|---|---|
main.cpp | 程序入口,解析命令行参数,初始化发布者/订阅者应用,并启动运行。 |
Application.hpp/cpp | 抽象应用基类,定义发布者和订阅者的通用接口(如run()、stop())。 |
PublisherApp.hpp/cpp | 发布者实现类,负责按配置发送消息,并统计吞吐量。 |
SubscriberApp.hpp/cpp | 订阅者实现类,负责接收消息并记录接收情况。 |
CLIParser.hpp | 命令行参数解析,处理用户输入的配置(如消息大小、传输协议、QoS策略等)。 |
types/ | 定义不同大小的消息类型(通过IDL生成),如Benchmark_small(16KB)、Benchmark_big(8MB)等。 |
benchmark_profile.xml | DDS QoS配置文件,定义参与者、数据读写器的可靠性、持久性等策略。 |
CMakeLists.txt | 编译配置,生成可执行文件并复制XML配置到构建目录。 |
二、核心逻辑
1. 消息类型设计
types/目录下的消息类型通过IDL定义,并由fastddsgen工具生成C++代码,支持不同大小的消息传输:
BenchMark:仅包含一个uint32_t索引(无附加数据)。BenchMarkSmall:包含uint32_t索引 + 16KB数组(std::array<char, 16384>)。BenchMarkMedium:包含uint32_t索引 + 512KB数组(std::array<char, 524288>)。BenchMarkBig:包含uint32_t索引 + 8MB数组(std::array<char, 8388608>)。
这些类型用于模拟不同大小的 payload,测试DDS在不同数据量下的性能。
2. 命令行参数解析(CLIParser.hpp)
支持配置多种运行参数,核心配置项如下:
- 角色:
publisher或subscriber(必选)。 - 消息大小:
NONE(默认)、SMALL、MEDIUM、BIG(对应上述消息类型)。 - 传输协议:
DEFAULT(SHM + UDPv4)、SHM(共享内存)、UDPv4、LARGE_DATA(大数据模式)。 - QoS策略:
- 可靠性(
--reliable):可靠传输(默认)或尽力而为(未指定时)。 - 持久性(
--transient-local):瞬态本地(默认)或volatile。
- 可靠性(
- 发布者特有参数:
- 消息发送间隔(
-i,默认100ms)。 - 运行超时时间(
-to,默认10s)。 - 发送样本数(
-s,默认无限)。
- 消息发送间隔(
解析后的参数被封装到benchmark_config结构体,用于初始化发布者/订阅者。
3. 发布者逻辑(PublisherApp.cpp)
- 初始化:根据配置创建DDS参与者(Participant)、主题(Topic)、数据写入器(DataWriter),并等待订阅者发现(通过
matched_变量判断)。 - 消息发送:
- 循环发送消息,根据配置的
interval控制发送间隔。 - 消息索引自增,用于跟踪发送顺序。
- 循环发送消息,根据配置的
- 性能统计:
- 记录总运行时间、发送样本数。
- 计算吞吐量(每秒传输字节数),并按
Gbps/Mbps/Kbps格式化输出。
4. 订阅者逻辑(隐含于代码结构)
- 初始化:创建DDS参与者、主题、数据读取器(DataReader),等待发布者发现。
- 消息接收:通过回调函数接收消息,记录接收的样本索引,验证消息完整性。
- 匹配与退出:持续运行直至接收指定数量的样本或被中断(Ctrl+C)。
5. QoS配置(benchmark_profile.xml)
默认配置:
- 参与者(Participant):使用域ID 0。
- 数据写入器/读取器:
- 可靠性:可靠(
RELIABLE)。 - 持久性:瞬态本地(
TRANSIENT_LOCAL)。 - 历史记录:保留最后100个样本(
KEEP_LAST,深度100)。
- 可靠性:可靠(
用户可修改XML文件调整QoS策略,测试不同配置对性能的影响。
三、运行流程
- 编译:通过
CMake构建,生成benchmark可执行文件。 - 启动订阅者:
./benchmark subscriber [选项] # 如指定消息大小:--msg-size BIG - 启动发布者:
./benchmark publisher [选项] # 如指定传输协议:--transport SHM - 输出结果:发布者完成后输出总样本数、吞吐量等统计信息(示例如下):
RESULTS after 1206 milliseconds: COUNT: 500 SAMPLES: 41,46,44,... THROUGHPUT BPS: 3.48482 Gbps
四、核心测试场景
通过组合不同参数,可测试:
- 不同消息大小(16KB~8MB)对吞吐量的影响。
- 传输协议(SHM vs UDPv4)的性能差异(共享内存通常更快)。
- 可靠性QoS(可靠传输 vs 尽力而为)对传输效率的影响。
- 大数据模式(
LARGE_DATA)对超大消息的处理能力。
该示例为评估Fast-DDS在不同场景下的性能提供了灵活的测试框架。

被折叠的 条评论
为什么被折叠?



