计算机
c base
c++ 基础 作用域及生命周期
c++ template
c++ 内存视角
c++ 函数指针
c++ 基础 基础语法
c++ 多线程
c++ 性能
c++ 类 基础
c++ 类 对象模型 类析构
c++ 类 设计模式
cmake
CMAKE环境搭建 windows
创建第一个cmakelists.txt
构建稍复杂的项目
动态链接库
EX1
EX1 START
EX1 ANSWER
EX2
EX2 START
EX2 ANSWER
EX3
EX3 START
EX3 ANSWER
变量
控制流程
函数和宏
查找和使用外部库
生成器表达式
qt 开发环境
qt c++
理解QObject 1
理解QObject 4
qt index
qt qml quick
qt ui
qt 多线程
数据结构 数组
PC问题监控及排查
PC程序性能优化
OS
TOOL
C++ STL
编程漫谈
C++实战-生产者 消费者流水线
C++实战 IO
本站点使用 MrDoc 构建
-
+
C++实战-生产者 消费者流水线
## 2) 怎么测算生产者的吞吐率(P,items/s) 生产者吞吐率本质上有两种:**能力上限**与**实际产出**。 ### 2.1 测“生产者能力上限”(不被下游影响) 目的:测生产者自身能多快地产生 item。 方法: 1. **把下游替换成空操作 sink**(不阻塞、不限速) 2. 让 producer 运行足够长(≥10s 或固定产生 N 个 item) 3. 统计吞吐: Pcap\=ΔproducedΔtP\_{cap}=\\frac{\\Delta produced}{\\Delta t}Pcap\=ΔtΔproduced C++ 统计要点: * 用 `std::chrono::steady_clock` * 生产计数用 `std::atomic<uint64_t> produced` * 每秒打印一次(滑动窗口更稳) 注意: * 如果 producer 内含 IO(读文件/读网),那测到的是“在当前 IO 条件下的能力”,不是纯 CPU 上限。 ### 2.2 测“生产者实际产出率”(受队列满/背压影响) 目的:测真实系统里 producer 实际每秒交付多少。 定义: * `produced`:生成的总数 * `enqueued`:成功入队的总数 * `blocked_time`:因队列满而等待的时间(如果你能统计) 实际产出率通常看: Pout\=ΔenqueuedΔtP\_{out}=\\frac{\\Delta enqueued}{\\Delta t}Pout\=ΔtΔenqueued 并且建议同时看阻塞占比: BlockedRatio\=blocked\_timeΔtBlockedRatio=\\frac{blocked\\\_time}{\\Delta t}BlockedRatio\=Δtblocked\_time 如果 `BlockedRatio` 很高,说明 producer 被背压限制;此时提高 producer 线程数没有意义。 ### 2.3 用“单次生产耗时”反推吞吐(微基准) 如果 producer 单线程、每个 item 的平均生产耗时为 tpt\_ptp 秒: Pcap≈nptpP\_{cap}\\approx \\frac{n\_p}{t\_p}Pcap≈tpnp * `n_p`:生产者线程数 * `t_p`:生产一个 item 的平均耗时(要在“下游不阻塞”条件下测) 适用于 CPU 生产、或可控环境下的 IO 生产。 ### 2.4 生产者是“拉取型”时怎么测 比如 producer 从 socket/消息队列拉数据: * 如果上游供给不足,你测到的会是 **上游发送速率**,不是 producer 能力。 做法: * 用本地回环/压测源(可控发送) * 或用记录文件回放(稳定输入) # 6. 测算队列大小 流水线里,**队列容量**同样重要。 * * * ## 用 Little 定律估算队列长度 L=λW 其中: * `L`:平均队列长度 * `λ`:吞吐率(每秒多少任务) * `W`:任务在队列里的平均等待时间 如果你希望系统能承受一个短暂抖动,比如: * 吞吐率 `λ = 5000/s` * 希望能缓冲 `100ms` 那么队列容量至少: 5000×0.1\=5005000 \\times 0.1 = 5005000×0.1\=500 再加一定冗余,比如 20%~50%: * 建议队列容量:`600~800`
peipeo
2026年5月11日 00:18
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码