Skip to content

回放工具多线程 75 倍提速

将回放工具从单线程串行解析改为多线程并行,30 秒 → 400 毫秒,提速约 75 倍。

背景

小鹏的 xdata_service 回放工具用于台架调试。原始实现是单线程逐行解析录制数据,解析一个 30 秒的录制文件需要约 30 秒——等于只能离线分析,不能在台架上实时调试。

问题

  1. 单线程串行:逐行解析日志,I/O 和解析交替等待
  2. 每帧 log 消费:日志输出本身成为性能瓶颈
  3. logstr 栈溢出:字符串拼接未做容量控制

方案

多线程架构

┌─────────────┐
│  File I/O   │ → 线程1: 分块读取二进制数据
└──────┬──────┘
       │ 数据块

┌─────────────┐
│  Parse Pool │ → 线程2-5: 并行解析各数据块
└──────┬──────┘
       │ 解析结果

┌─────────────┐
│  Assemble   │ → 主线程: 按时间戳组装结果
└─────────────┘

优化细节

  • 分块策略:按时间戳均匀分块,避免某一线程负载过高
  • 无锁队列:解析线程 → 组装线程用无锁队列通信
  • 内存池:频繁分配的小对象用内存池管理

性能瓶颈定位

  • 用火焰图定位 GC 峰值 → 对象分配过多
  • 用 Deep Profiler 追踪每帧 log 消费 → 日志输出 3.9GB 数据

结果

指标优化前优化后提升
解析 30s 数据~30s~400ms75×
内存峰值3.9GB~1.2GB3.25×

后续

  • Mac 端跨平台支持
  • 集成到 CI 流水线做自动性能回归

企业级技术案例库 · 内容先审计再发布