4. 性能指标定义:延迟、吞吐量、CPU占用率、内存带宽
在HIDL通信链路性能调优中,必须建立统一的量化指标体系。没有精确的指标定义,调优将沦为盲目试错。本章定义四个核心维度:延迟(Latency)、吞吐量(Throughput)、CPU占用率(CPU Utilization)、内存带宽(Memory Bandwidth),并给出各指标在Camera HAL3 HIDL场景下的测量方法与典型基线。
4.1 延迟(Latency)
延迟指一次HIDL请求从发起端(Camera Service / App)到服务端(HAL实现)再返回结果的完整耗时。在Camera HAL3中,延迟主要分布在以下环节:
- Binder/HIDL RPC传输延迟:序列化/反序列化、数据拷贝、进程间切换。
- HAL服务端处理延迟:HAL实现内部逻辑、硬件寄存器操作、等待帧同步。
- 回调/通知延迟:HIDL回调从HAL到Framework的异步通知耗时。
关键测量点: 使用
getTimestamp() 在HIDL接口入口和出口打点,计算端到端延迟。重点关注 processCaptureRequest() 和 flush() 两个高频接口。
调优目标: 单次HIDL调用延迟应控制在 500μs 以内(不含硬件等待),否则会影响预览帧率和拍照响应速度。
4.2 吞吐量(Throughput)
吞吐量定义为单位时间内HIDL接口成功处理的请求数量。在Camera HAL3中,吞吐量直接决定最大预览帧率和连拍速度。
| 接口 | 典型吞吐量要求 | 瓶颈点 |
|---|---|---|
processCaptureRequest() |
≥ 30 次/秒(30fps预览) | HIDL传输带宽、HAL处理流水线 |
flush() |
≤ 5ms 完成 | HAL内部队列清空速度 |
notify() 回调 |
≥ 30 次/秒 | 回调线程调度、HIDL回调通道 |
常见陷阱: 吞吐量测量时需区分“请求发出速率”和“完成速率”。如果HAL内部有排队机制,发出速率可能远高于实际完成速率,导致丢帧。务必在HAL端统计实际完成数。
4.3 CPU占用率(CPU Utilization)
CPU占用率反映HIDL通信链路对处理器资源的消耗。过高的CPU占用率会导致系统发热、降频,进而影响相机稳定性。
在Camera HAL3 HIDL场景下,CPU占用率主要来自:
- 序列化/反序列化线程:HIDL自动生成的桩代码(stub)执行数据打包。
- 数据拷贝线程:大块图像数据(如YUV、RAW)在进程间传递时的memcpy。
- HAL工作线程:处理请求、驱动硬件、等待中断。
- 回调分发线程:将结果通知回Framework。
测量方法: 使用
perfetto 或 systrace 抓取HIDL服务进程的CPU时间片分布。重点关注 android.hardware.camera.provider 和 camera.hal 两个进程的CPU占用。
典型基线: 在1080p 30fps预览场景下,HIDL通信链路(不含ISP硬件处理)的CPU占用率应 ≤ 15%(单大核)。若超过30%,说明存在过度拷贝或低效序列化。
4.4 内存带宽(Memory Bandwidth)
内存带宽指HIDL通信过程中数据在内存子系统(DDR/L3缓存)中传输的速率。Camera HAL3涉及大量图像数据(每帧数MB到数十MB),内存带宽往往成为隐藏瓶颈。
关键带宽消耗点:
- HIDL数据拷贝:从HAL进程空间拷贝到Framework进程空间(或通过共享内存绕过)。
- 格式转换:YUV→NV21、RAW→YUV等转换过程中的内存读写。
- Metadata序列化:CameraMetadata的键值对打包/解包。
| 分辨率 | 帧率 | 单帧大小 | 所需带宽(理论) | HIDL拷贝开销 |
|---|---|---|---|---|
| 1920×1080 (NV12) | 30fps | ~3.1 MB | ~93 MB/s | ~186 MB/s(双倍拷贝) |
| 3840×2160 (NV12) | 30fps | ~12.4 MB | ~372 MB/s | ~744 MB/s |
| 4000×3000 (RAW10) | 15fps | ~15 MB | ~225 MB/s | ~450 MB/s |
调优策略: 使用
HIDL MemoryBlock 或 hidl_memory 共享内存机制,避免不必要的memcpy。对于大块图像数据,优先使用 IMemory 或 NativeHandle 传递文件描述符(fd),实现零拷贝。
4.5 指标关联与权衡
四个指标并非独立,存在典型的权衡关系:
- 延迟 vs 吞吐量:增加批处理(batch)可提升吞吐量,但会引入额外延迟。
- CPU占用率 vs 内存带宽:使用CPU进行格式转换可减少内存带宽消耗,但增加CPU占用。
- 内存带宽 vs 延迟:使用更大的buffer pool可降低延迟,但增加内存带宽压力。
调优优先级建议: 在Camera HAL3 HIDL场景下,建议优先优化 内存带宽 和 延迟,因为这两个指标直接影响用户体验(帧率、拍照响应)。CPU占用率通常作为约束条件,不超过系统阈值即可。
4.6 指标采集工具链
在实际调优中,建议使用以下工具组合采集四个指标:
| 指标 | 推荐工具 | 采集方式 |
|---|---|---|
| 延迟 | perfetto / systrace |
在HIDL接口前后插入trace点,解析trace文件 |
| 吞吐量 | dumpsys media.camera + 自定义计数器 |
统计HAL端每秒完成的request数 |
| CPU占用率 | top / perf / simpleperf |
按进程/线程统计CPU时间片 |
| 内存带宽 | perf stat -e instructions,cycles,LLC-load-misses |
通过性能计数器估算内存访问量 |
注意: 内存带宽的精确测量需要硬件性能计数器(如ARM PMU),在Android设备上可能需要root权限。对于调优初期,可通过“数据拷贝次数 × 单次拷贝大小 × 帧率”估算理论带宽,再与实测CPU占用率交叉验证。
本章定义的四个指标将作为后续调优章节的量化基准。在进入具体优化技术之前,请确保你的测试环境能够稳定采集这些指标,并建立基线数据。