第二章:性能指标体系
实时性:延迟与抖动
做车载系统这么多年,我最大的体会就是——实时性不是快,而是可预测。你想想看,一个刹车指令从发出到执行,如果有时候5毫秒,有时候50毫秒,那谁敢用?
延迟(Latency)说白了就是“从输入到输出花了多久”。在车载场景下,我习惯把它拆成三部分:
- 感知延迟:传感器数据采集到特征提取完成
- 决策延迟:算法模型推理出结果
- 执行延迟:控制指令发送到执行器响应
抖动(Jitter)才是真正让人头疼的东西。我记得有一次调试一个ADAS系统,平均延迟只有8ms,但偶尔会跳到120ms。嗯,这种“偶尔”在功能安全里就是灾难。
核心指标速查表
| 指标 | 典型要求 | 我的经验值 |
|---|---|---|
| 感知延迟 | < 50ms | 实际做到30ms以内比较稳 |
| 决策延迟 | < 100ms | L3以上建议压到60ms |
| 抖动范围 | < 10% 均值 | 超过5%就要排查了 |
避坑指南
我曾经遇到过一个项目,实验室测延迟完全达标,一上路就超时。后来发现是CAN总线在电磁干扰下重传导致的。所以我的建议是:一定要在实车电磁环境下测延迟分布,别只看平均值。
吞吐量:FPS与TOPS
吞吐量这个词,不同角色理解完全不同。做算法的朋友喜欢说FPS,做硬件的朋友更爱谈TOPS。我个人的看法是——两者都得看,但得看对地方。
FPS(Frames Per Second) 是应用层的指标。比如一个摄像头30FPS,意味着每33ms要处理完一帧。这里有个坑:FPS高不代表延迟低。我曾经见过一个系统标称60FPS,但每帧处理时间波动很大,前10帧只用了150ms,第11帧突然卡了500ms。这种“假高吞吐”在车载里是要命的。
TOPS(Tera Operations Per Second) 是算力层的指标。但说实话,TOPS这个数字水分挺大的。同样是10TOPS的芯片,跑MobileNet和跑ResNet的结果天差地别。我建议你关注的是有效TOPS——也就是在目标模型上实际能跑出来的算力。
吞吐量评估矩阵
| 场景 | 推荐FPS | 推荐TOPS | 备注 |
|---|---|---|---|
| 前视摄像头 | 30-60 | 10-30 | 单目,L2级别 |
| 环视系统 | 15-30 | 20-50 | 4-6路拼接 |
| 激光雷达 | 10-20 | 50-100 | 点云处理 |
| L4全栈 | 30+ | 200+ | 多传感器融合 |
我的小技巧
评估吞吐量时,别只看峰值。我习惯用“95分位吞吐”——也就是95%的情况下能达到的吞吐量。这个值比平均值更能反映真实体验。
可靠性:ASIL等级与故障恢复
可靠性这块,我得说点大实话。很多团队把ASIL等级当成“认证标签”,觉得拿到ASIL-D就万事大吉了。但我在项目里踩过的坑告诉我——ASIL是设计目标,不是测试结果。
ASIL(Automotive Safety Integrity Level) 分A、B、C、D四个等级,D最高。它主要看三个维度:
- 严重度(Severity):出事了会怎样?
- 暴露率(Exposure):出事的概率多大?
- 可控性(Controllability):驾驶员能补救吗?
举个例子,转向系统如果失效,严重度是S3(生命危险),暴露率是E4(每次驾驶都可能),可控性是C3(基本无法补救)。三个一乘,就是ASIL-D。
故障恢复时间(Fault Recovery Time) 这个指标,说实话很多文档里写得不够细。我自己的定义是:从故障发生到系统恢复到安全状态的时间。注意,不是恢复到“正常工作”,而是恢复到“安全状态”。
重要提醒
我曾经在一个项目中,把故障恢复时间定成了“重启系统”。结果测试发现,重启一次要12秒。对于高速行驶的车辆,12秒足够冲出几百米了。后来我们改成了“降级模式”——故障后立即切换到备份通道,恢复时间压到了50ms以内。
知识体系总览
下面这张图是我自己整理的性能指标体系框架。你看,这三个维度其实是互相影响的——实时性不好,吞吐量再高也没用;可靠性不够,实时性再稳也是白搭。
实际调优中的取舍
你可能会问:这三个指标到底哪个更重要?我的回答是——看场景。
举个例子:
- 紧急制动:实时性排第一,延迟必须压到10ms以内,吞吐量可以牺牲
- 环视拼接:吞吐量更重要,FPS低了画面会卡顿,延迟稍高一点问题不大
- 转向控制:可靠性是底线,ASIL-D必须满足,哪怕牺牲一些实时性
我的调优优先级(仅供参考)
- 先满足ASIL等级要求(这是法律底线)
- 再压实时性到目标值(这是用户体验)
- 最后优化吞吐量(这是成本效率)
这个顺序我用了好几年,基本没出过大问题。
一个小建议
刚开始做性能调优时,别想着一步到位。我习惯先搭一个最小可运行系统,把实时性和可靠性跑通,再慢慢往上加吞吐量。这样出了问题,排查范围小很多。