C++性能优化——返回vector作为返回类型的函数

发布时间 2023-04-19 16:03:34作者: 偷不走的影子

方案/设计描述

代码性能优化:使用引用获取计算结果,优化GetLatestM2MAssociationResult函数

  1. 此函数返回类型为vector的函数,在开启编译器优化时,是会进行返回值优化(RVO,Return Value Optimization)的,会避免返回时和获取返回值时的拷贝。但某些编译器不一定优化,因此改为在函数中增加一个vector类型的引用参数。
  2. GetLatestM2MAssociationResult中做上述修改,从m2m_association_result_中获取vector时,仍然会造成到vector拷贝。因此m2m_association_results_的value类型改为std::shared_ptr<std::vector>类型,实现共享vector,避免拷贝。可能存在的隐患:潜在的循环引用,造成内存泄漏。
using M2MIndexPairsPtr = std::shared_ptr<std::vector<MeasurementMeasurementIndexPair>>;
  1. m2m_association_results_原来定义为std::map,查询时间复杂度为O(logN)。因为并不要求Key有序,只做查询,因此改为std::unordered_map,查询时间复杂度为O(1)。
std::unordered_map<AssociateType, M2MIndexPairsPtr> m2m_association_results_;
  1. MultiSensorFusion::CollectM2MAssociateResult 中更新哈希表m2m_association_result_时,使用std::move()将局部变量vector所有权转移到std::shared_ptr的构造函数,避免了拷贝。
  2. 避免在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) {

}
  1. 用一个传感器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);