linux业务代码性能优化点

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倍!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值