• c/c++优化结构控制


    一、表达式优化--使用替换程序中的乘除法

    c/c++中的加减运算效率远远高于乘除运算,由于移位指令的执行速度和乘除法差不多,所以可以使用移位的方式来替换程序中的乘除法。一个数向右移一位,等于该数乘以2;向左移一位,等于该数除以2;通过这种移位的方式可以明显提高程序的工作效率;

    理论上讲,所有的乘法运算均可以转化为移位操作,如a*8,可以替换为:a<<3;a*13,可以替换为:a<<3+a<<2+a;

    但对于除法,只有a为2的n次幂时,才可以进项替换,如a/8,可以替换为a>>3;而a/13就无法进行替换;

    二、表达式优化--常量折叠

    通常程序运行过程中需要进行连续的四则运算,如

    int a=10;
    a=a+2*17+6;

    这个时候程序需要进行两次加法和一次乘法运算,而使用如下方式:

    int a;
    a=a+40;

    只需进行一次加法运算,此时的效率相比上面的运算就快了许多。通常把程序中的常量人为计算的方法叫做常量折叠

    *这是一种常规优化,很多编译器会自动完成,在日常编写过程中,不使用常量折叠可能更便于理解,需要自行斟酌

    三、表达式优化--使用数学公式

    通常数学公式都是为了简便运算而推导出来的,所以在计算机中也是一样。比如等差数列求和的运算,如果使用循环进行累加需要进行的步骤远比使用公式进行计算多,相应的效率也一定比使用公式低。

    四、表达式优化--存储问题

    变量的保存需要保存在内存中,而CPU对内存的访问相比对内部寄存器的访问是很耗时的,

    如x=x+1;这样的语句,程序默认右边会有两个以上操作数,尽管操作的变量是同一个,但全部过程对x的寻址操作依然有两次,还有一次加法。

    而使用x+=1;这样的语句,程序默认右边的操作数只有一个,只对变量寻址一次,计算加法存入x,相比上面的等式效率就会有所提高;

    五、分支优化--改变判断顺序

    这一天在if-else语句中尤为明显,举个例子,编写一个程序统计一篇英文文章中的字母、数字、空格个数。

    文章中肯定是字母数>空格数>数字数,

    如果先判断是不是数字,再判断是不是空格,再判断是不是字母,那么统计过程中大部分位置要统计至少三次

    如果换个判断顺序,先判断是不是字母,再判断是不是空格,再判断是不是数字,那么大部分位置仅仅只需要统计一次,这样的处理效率就比上面的效率要高出很多

    六、分支优化--使用switch语句

    从反汇编代码中可以看出,switch语句只需要比较一次即可跳转;而if-else则需要对每个跳转语句进行一次比较,所以,在多个同等级的比较分支结构中,尽可能使用switch语句编写的程序会比同功能的if-else语句执行起来效率要高

    七、循环优化--一次性计算

    循环结构中,多次不进行改变或运算的语句成为一次性计算,比较下面两个程序:

    先看下面这个程序:

    int len;
    int a[10];
    for(i=0;i<10;i++)
    {
            len=1;
            a[i]+=len;
    }

    这个程序中,每一次循环都需要对len重新赋值为1,非常耗时,效率并不高;

    再看下面这个程序:

    int len=1;
    int a[10];
    for(i=0;i<10;i++)
    {
             a[i]+=len;
    }

    每次循环只需进行一次加法,效率就比上面的程序高出许多

     八、结构体优化

    现在很多操作系统为了能高效的使用cpu,使用了对齐机制,每次都保证cpu读取同样长度的内容,以提高运行速度。这种对齐机制是一种典型的用空间换时间的做法。

    一些32位系统普遍使用了4字节对齐方式,对不足位用无用值(通常为0)填补。

    如果定义如下结构体:

    struct  test
    {
        char ch;int i;
      short s; }

    char类型占用一字节,short类型占用两个字节,int型占用四个字节,按照上面定义,char型占用了一个字节,而紧接着int型刚好占用4个字节,为了保证int型的完整连续,会默认把char的一个字节扩充为四字节,后面的short型也不足四字节,又要扩充为四字节,所以当对上面的结构体求长度时:

    sizeof(test)会等于12;


    但如果使用如下定义方式:
    struct test
    {
            char ch;
            short s;
            int i;
    }

    char和short型优先占用前三个字节,为了保证int型的完整连续,会对char和short共同占用的不足四字节的空间进行填补,那么就会只增加一个字节,所以当对上面的结构体求长度时:

    sizeof(test)会等于8;

    用这种良好的编程习惯,会既保证程序运行效率又最大限度的保证了合理的运用存储空间。

  • 相关阅读:
    Jmeter测试接口详细步骤(三)跨线程组传值-BeanShell 后置处理程序
    Jmeter测试接口详细步骤(二)HTTP Cookie管理器
    Jmeter测试接口详细步骤(一)基础操作
    最优化学习3
    最优化学习2
    最优化学习---从解方程到最优化1
    最优化学习---从解方程到最优化
    博客园 文章和随笔区别 (转
    refinedet tensorRT实现
    crnn pytorch 训练、测试
  • 原文地址:https://www.cnblogs.com/zlgxzswjy/p/5424365.html
Copyright © 2020-2023  润新知