planning优化的一些改动
----------> 减少值传递,多用引用来传递 <----------
// ----------> 减少值传递,多用引用来传递 <----------
// 例1:
class A{};
std::vector<A> v;
// for(auto elem : v) {} // 不建议,内部会调用拷贝构造
for(const auto &elem : v) {} // 建议
// 例2:
class StGraphData
{
private:
std::vector<STBoundary> mSTBoundaries;
public:
// std::vector<STBoundary> st_boundaries() {reutrn mSTBoundaries;}; // 不建议,内部会调用拷贝构造
const std::vector<STBoundary> &st_boundaries() {reutrn mSTBoundaries;}; // 建议
};
----------> 空间换时间,如果有多次计算查找操作,可以预先转化为相应的表,然后直接find <----------
// ----------> 空间换时间,如果有多次计算查找操作,可以预先转化为相应的表,然后直接find <----------
// 例1:
// 查找s的相应速度
std::vector<std::pair<double, double>> vec; // 其中first为ST图中的纵轴相应的值s,second为相应的速度speed,全部为固定值
double s_1(已知index),s_2(已知index),s_3(已知index)......,s_n(已知index); // s_n属于first范围
{
// 不建议,直接多次查找操作
for (...)
{
result_speed = std::lower_bound(vec.begin(), vec.end(), s_n, compare_s);
}
}
{
// 建议,先建立index-speed的表,直接根据index查找
std::vector<double> speed_index;
for (...)
{
result_speed = speed_index.at(index_n);
}
}
----------> 利用static减少一些函数调用 <----------
// ----------> 利用static减少一些函数调用 <----------
// 例1:
// 如果确定获取的变量为常量
void func()
{
// const double edge = Test::GetInstance()->GetConfig().edge(); // 不建议,会多次调用Test::GetInstance()
static const double edge = Test::GetInstance()->GetConfig().edge(); // 建议
}
int main()
{
for(...)
{
func();
}
}
----------> vector预定容量,减少扩容 <----------
// ----------> vector预定容量,减少扩容 <----------
{
// 不建议
for (...)
{
std::vector<int> v;
for (...)
{
v.emplace_back(i);
}
}
}
{
// 建议
for (...)
{
std::vector<int> v;
v.reserve(256); // 视情况而定容量
for (...)
{
v.emplace_back(i);
}
}
}
----------> 合理使用inline <----------
// 合理使用inline,当函数体内包含常量开销O(1)的简单语句,可以使用inline关键字修饰函数,减少函数调用出入栈操作
// Test.h
class Test
{
private:
int value;
public:
int getValue() const;
};
// Test.cpp
// int Test::getValue() const { return this->value;}; // 不建议
inline int Test::getValue() const { return this->value; }; // 建议
----------> gcc/g++ 可以采用开启O2级别优化(CMakeList: -DCMAKE_BUILD_TYPE=RelWithDebInfo) <----------
----------> 适当使用noexcept关键字 <----------
C++中的异常处理是在运行时而不是编译时检测的。为了实现运行时检测,编译器创建额外的代码,然而这会妨碍程序优化。
当编译器知道函数不会抛出异常时,它可以进行一些优化,提高代码的执行速度。这对于性能关键的应用程序特别有用。
----------> 列遍历跟行遍历的性能对比 <----------
// ----------> 列遍历跟行遍历的性能对比 <----------
cpu cache line 默认64B,可以看到性能差异近5倍!