Pull Request has been successfully merged by ascend-robot.
(Thank you for xieanran's contribution.)变更摘要
此 PR 优化了 CCU 最大延迟通道查找算法,将时间复杂度从 O(m×n) 降至 O(m+n)。核心思路是通过预构建前缀最大值索引(BuildChannelIndex),将原来每次查询时遍历全部通道数据改为对预排序数组进行二分查找。C++ 端新增 CCUChannelPrefixInfo 结构和 BuildChannelIndex 函数,并重构 GetMaxDelayChannel;Python 端同样采用按 channel_id 预分类字典替代原有的列表过滤方式,使查找操作从线性扫描优化为 O(1) 索引。
主要改动
- 新增
CCUChannelPrefixInfo结构与BuildChannelIndex函数:在ccu_mission_processor.cpp中引入前缀最大值索引结构,按channelId分组、按时间戳排序后,为每条记录预计算当前最大延迟(prefix max);BuildChannelIndex在FormatWaitTimelineData中仅调用一次,后续所有GetMaxDelayChannel查询共享该索引。 - 重构
GetMaxDelayChannel使用二分查找:将原来的两层嵌套遍历(hostData × channelData)改为对CCUChannelIndex的std::lower_bound二分查找,通过recordIter->maxDelay直接获取当前时间点前的最大延迟通道,避免了原先对全体 channel 数据的重复扫描。 - Python 端
get_max_delay_channel_and_channel_delay采用预分类字典:channel_data参数类型从list改为dict,在get_formatted_wait_data中通过defaultdict(list)按channel_id预分类通道数据,使最大延迟通道查找从 O(n) 过滤降为 O(1) 直接索引。 - 单元测试补充边界用例:在
ccu_mission_processor_utest.cpp的BuildChannelData中新增一条 channelId=4 的测试数据{4, 9000, 0, 0, 999},用于覆盖同一 channelId 存在多条记录时前缀索引的正确性。


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


【review】【设计】Python 端的 get_max_delay_channel_and_channel_delay 仍使用 max(seq_channel, key=lambda x: x.avg_bw) 计算最大延迟通道,但 avg_bw 是平均带宽,不是延迟(delay)。字段名 avg_bw 与语义 max_delay_channel 不符。,建议修改:应该使用 avg_delay 而非 avg_bw 来计算最大延迟通道


【review】【编码】调用位置对--recordIter的取值,是对 lower_bound 返回的前一个元素取值,但 lower_bound 返回的是 >= missionData.endTime 的第一个元素,因此 --recordIter 是 timestamp < endTime 的最大元素。但当 channelRecords 中有多个相同 timestamp 的记录,lower_bound 可能返回第一个 >= endTime 的元素,而 prefix 中该位置的 maxDelay 可能不是该 timestamp 下所有记录合并后的最大值。建议在 BuildChannelIndex 中处理相同 timestamp 的情况。


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


PR 合入模板
注:经过自检不涉及的可标注“不涉及”或直接打勾,特殊情况请文字备注。不符合规范的 PR 不允许合入,请(后备)commit 注意。
1. 修改描述
后续优化方向:看看能不能压缩channel id,目前看虽然算法是o(m+n),已降至线性,其次可以看下能否优化匹配算法本身。
2. 功能验证
3. 分支合并要求
3. 代码检视
要求:
是否经过代码检视
是否具备 UT 测试用例看护 (如不符合,请说明原因:____________________)
检视意见数:____ 条 (请填写本次检视的意见总数,用于commit合入前审视)
4. 安全自检
Python、C++
C++
5. 变更知会