linux c++提高程序性能

本文介绍了C++编程中的一些效率提升技巧,如减少值传递、使用引用来传递参数、++运算符的效率差异、循环结构优化、避免多重继承、减少dynamic_cast使用、优化除法运算、内联函数和直接初始化,以提升程序运行性能。
摘要由CSDN通过智能技术生成

1. 值传递涉及复杂对象时会进行拷贝,设计构造函数和析构函数的调用,增加开销

  1. 尽量减少值传递,多用引用来传递参数

2.++i和i++引申出的效率问题

    ++运算符前+和后+都会进行重载,但是先用后加的话会调用拷贝构造函数和析构函数,先加后用不会,如果在循环中调用,则会导致巨量的重复调用

3. 循环内定义和循环外定义

ClassTest CT;
for(int i = 0; i < 100; ++i)
{
  CT = a;
  //do something
}

1次构造函数,100次赋值运算符重载
 

for(int i = 0; i < 100; ++i)
{
  ClassTest CT = a;
  //do something
}

100次复制构造函数,100次析构函数;

二者性能常规情况下边年的会好些;

4. 循环的讨论2(避免过大循环)

for(int i = 0; i < n; ++i)
{
  fun1();
  fun2();
}








for(int i = 0; i < n; ++i)
{
  fun1();
}
for(int i = 0; i < n; ++i)
{
  fun2();
}

这里两段代码结果是一样的,从代码层面来看,1的效率更高,毕竟1少了n次自加运算和判断,

但实际来说,这里要看fun1和fun2两个函数的规模和复杂性,如果fun1和fun2语句很多,规模较大, 则2的运行效率要高于1,因此for循环如果内容可以一次性加载进cache中,则cpu访问速度快,可以迅速处理完,否则的话则需要重复访问内存来获取数据,降低效率,实际情况参考实际情况进行测试

5. 局部变量vs静态变量

        局部变量使用的是栈,当一个方法被频繁调用的时候,这个栈空间会被频繁读写,然后这块内存会留在cpu的缓存中。cpu的缓存是比内存快的。这样来看就是局部变量效率更高了。待实际测试

6. 避免使用多重继承

在C++中,支持多继承,即一个子类可以有多个父类。书上都会跟我们说,多重继承的复杂性和使用的困难,并告诫我们不要轻易使用多重继承。其实多重继承并不仅仅使程序和代码变得更加复杂,还会影响程序的运行效率。

这是因为在C++中每个对象都有一个this指针指向对象本身,而C++中的类对成员变量的使用是通过this的地址加偏移量来计算的,而在多重继承的情况下,这个计算会变量更加复杂,从而降低程序的运行效率。而为了解决二义性,而使用虚基类的多重继承对效率的影响更为严重,因为其继承关系更加复杂和成员变量所属的父类关系更加复杂。

7. 尽量少使用dynamic_cast

dynamic_cast的作用是进行指针或引用的类型转换,dynamic_cast的转换需要目标类型和源对象有一定的关系:继承关系。 实现从子类到基类的指针转换,实际上这种转换是非常低效的,对程序的性能影响也比较大,不可大量使用,而且继承关系越复杂,层次越深,其转换时间开销越大。在程序中应该尽量减少使用。

      

8. 减少除法运算的使用

无论是整数还是浮点数运算,除法都是一件运算速度很慢的指令,在计算机中实现除法是比较复杂的。所以要减少除法运算的次数,下面介绍一些简单方法来提高效率:

  1. 通过数学的方法,把除法变为乘法运算,如if(a > b/c),如果a、b、c都是正数,则可写成if(a*c > b)。
  2. 让编译器有优化的余地,如里你要做的运算是int型的n/8的话,写成(unsigned)n/8有利于编译器的优化。而要让编译器有优化的余地,则除数必须为常数,而这也可以用const修饰一个变量来达到目的。

9. 将小粒度函数声明为内联函数(inline)

正如我们所知,调用函数是需要保护现场,为局部变量分配内存,函数结束后还要恢复现场等开销,而内联函数则是把它的代码直接写到调用函数处,所以不需要这些开销,但会使程序的源代码长度变大。

所以若是小粒度的函数,如下面的Max函数,由于不需要调用普通函数的开销,所以可以提高程序的效率。

10. 多用直接初始化

与直接初始化对应的是复制初始化,什么是直接初始化?什么又是复制初始化?举个简单的例子,

ClassTest ct1;
ClassTest ct2(ct1);  //直接初始化
ClassTest ct3 = ct1;  //复制初始化

ClassTest ct1("ab");//直接初始化 
ClassTest ct2 = "ab";//复制初始化 
ClassTest ct3 = ct1;//复制初始化 
ClassTest ct4(ct1);//直接初始化 
ClassTest ct5 = ClassTest();//复制初始化 

那么直接初始化与复制初始化又有什么不同呢?直接初始化是直接以一个对象来构造另一个对象,如用ct1来构造ct2;复制初始化是先构造一个对象,再把另一个对象值复制给这个对象,如先构造一个对象ct3,再把ct1中的成员变量的值复制给ct3,从这里,可以看出直接初始化的效率更高一点。而且使用直接初始化还是一个好处,就是对于不能进行复制操作的对象,如流对象,是不能使用复制初始化的,只能进行直接初始化。可能我说得不太清楚,那么下面就引用一下经典吧!

参考链接:【C++】提高程序运行效率的10个简单方法_c++加快运行速度-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值