Appearance
回放工具多线程 75 倍提速
将回放工具从单线程串行解析改为多线程并行,30 秒 → 400 毫秒,提速约 75 倍。
背景
小鹏的 xdata_service 回放工具用于台架调试。原始实现是单线程逐行解析录制数据,解析一个 30 秒的录制文件需要约 30 秒——等于只能离线分析,不能在台架上实时调试。
问题
- 单线程串行:逐行解析日志,I/O 和解析交替等待
- 每帧 log 消费:日志输出本身成为性能瓶颈
- logstr 栈溢出:字符串拼接未做容量控制
方案
多线程架构
┌─────────────┐
│ File I/O │ → 线程1: 分块读取二进制数据
└──────┬──────┘
│ 数据块
▼
┌─────────────┐
│ Parse Pool │ → 线程2-5: 并行解析各数据块
└──────┬──────┘
│ 解析结果
▼
┌─────────────┐
│ Assemble │ → 主线程: 按时间戳组装结果
└─────────────┘优化细节
- 分块策略:按时间戳均匀分块,避免某一线程负载过高
- 无锁队列:解析线程 → 组装线程用无锁队列通信
- 内存池:频繁分配的小对象用内存池管理
性能瓶颈定位
- 用火焰图定位 GC 峰值 → 对象分配过多
- 用 Deep Profiler 追踪每帧 log 消费 → 日志输出 3.9GB 数据
结果
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 解析 30s 数据 | ~30s | ~400ms | 75× |
| 内存峰值 | 3.9GB | ~1.2GB | 3.25× |
后续
- Mac 端跨平台支持
- 集成到 CI 流水线做自动性能回归