方案/设计描述
代码性能优化:使用引用获取计算结果,优化GetLatestM2MAssociationResult函数
- 此函数返回类型为vector的函数,在开启编译器优化时,是会进行返回值优化(RVO,Return Value Optimization)的,会避免返回时和获取返回值时的拷贝。但某些编译器不一定优化,因此改为在函数中增加一个vector类型的引用参数。
GetLatestM2MAssociationResult
中做上述修改,从m2m_association_result_
中获取vector时,仍然会造成到vector拷贝。因此m2m_association_results_
的value类型改为std::shared_ptr<std::vector>
类型,实现共享vector,避免拷贝。可能存在的隐患:潜在的循环引用,造成内存泄漏。
using M2MIndexPairsPtr = std::shared_ptr<std::vector<MeasurementMeasurementIndexPair>>;
m2m_association_results_
原来定义为std::map,查询时间复杂度为O(logN)。因为并不要求Key有序,只做查询,因此改为std::unordered_map
,查询时间复杂度为O(1)。
std::unordered_map<AssociateType, M2MIndexPairsPtr> m2m_association_results_;
MultiSensorFusion::CollectM2MAssociateResult
中更新哈希表m2m_association_result_
时,使用std::move()将局部变量vector所有权转移到std::shared_ptr
的构造函数,避免了拷贝。- 避免在for循环条件中调用函数,否则每次迭代都会进行函数调用(以及指针调用)。提前保存在局部变量中,则只会进行一次调用。
for (size_t j = 0U; j < latest_radar_frame->GetForegroundObjects().size(); ++j) {
...
}
改为
size_t foreground_objects_size = latest_radar_frame->GetForegroundObjects().size();
for (size_t j = 0U; j < foreground_objects_size; ++j) {
}
- 用一个传感器frame更新另一个传感器frame的处理逻辑有很多重复代码,封装成了两个函数减少重复,提升代码可读性。
void MultiSensorFusion::UpdatePairSecondFrameAssociationResultWithPairFirst(const M2MIndexPairsPtr& association_result_ptr,
SensorFramePtr& source_frame_ptr,
SensorFramePtr& target_frame_ptr, const size_t index);
void MultiSensorFusion::UpdatePairFirstFrameAssociationResultWithPairSecond(const M2MIndexPairsPtr& association_result_ptr,
SensorFramePtr& source_frame,
SensorFramePtr& target_frame, const size_t index);
标签:返回,std,frame,C++,vector,ptr,association,size
From: https://www.cnblogs.com/qiangz/p/17333627.html