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;
}

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

时间: 2024-09-24 16:12:46

c/c++优化结构控制的相关文章

Hive参数层面优化之一控制Map数

1.Map个数的决定因素 通常情况下,作业会通过input文件产生一个或者多个map数: Map数主要的决定因素有: input总的文件个数,input文件的大小和集群中设置的block的大小(在hive中可以通过set dfs.block.size命令查看,该参数不能自定义修改): 文件块数拆分原则:如果文件大于块大小(128M),那么拆分:如果小于,则把该文件当成一个块. 举例一: 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和

怒学Python——第三篇——结构控制

众所周知,程序语句运行的结构无非是顺序结构.分支结构和循环结构,Python也是如此,顺序结构过于简单不提,简单记录一下分支和循环与C++的异同点,顺便提一下,对于已经会C++的人来说,学Python应该注意的是语句块通过缩进来控制. 分支结构:都使用if.else,多出了一个elif代替C++的else if,本质相同,就不给出例子 循环结构:和C++对比,没有了do..until语句,有while和for,里面同样使用break来结束循环,使用continue来进入下一个循环,但for出现了

hive优化之——控制hive任务中的map数和reduce数

一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改): 2.    举例:a)    假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数

mysq&#39;l系列之10.mysql优化&amp;权限控制

网站打开慢如何排查 1.打开网页, 用谷歌浏览器F12, 查看network: 哪个加载时间长就优化哪个 2.如果是数据库问题 2.1 查看大体情况 # top # uptime  //load average 负载 mysql> show full processlist; 2.2 查看慢查询日志: long_query_time = 1 log-slow-queries = /data/3306/slow.log 日志分析工具: mysqldumpslow  mysqlsla  myprof

PLSQL——03、结构控制

使用IF语句按条件判断,控制PL/SQL执行流程 格式如下:if-then-end if;if-then-else-end if;if-then-elsif-then-else-end if; 演示: set serveroutput on declare v_hire_date date := to_date('1995-01-15','yyyy-mm-dd'); v_five_years boolean; begin if months_between(sysdate,v_hire_date

hive优化之------控制hive任务中的map数和reduce数

.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改): 2.    举例: a)    假设input目录下有1个文件a,大小为780M,那么Hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个ma

【转】hive优化之--控制hive任务中的map数和reduce数

一.    控制hive任务中的map数:  1.    通常情况下,作业会通过input的目录产生一个或者多个map任务. 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改): 2.    举例: a)    假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个m

IT兄弟连 Java语法教程 流程控制语句 控制循环结构2

使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循环本身.如下程序示范了continue的用法. public class ContinueDemo{ public static void main(String[] args){ for(int i = 0; i<3; i++){ System.out.println("i的值是"

细菌觅食优化算法:理论基础,分析,以及应用(未完)

原作者:Swagatam Das,Arijit Biswas,Sambarta Dasgupta,和Ajith Abraham  [摘 要]细菌觅食优化算法(Bacterial foraging optimization algorithm[BFOA])已经被分布式优化和控制的同行们当作一种全局性的优化算法接受.BFOA是由大肠杆菌的群体觅食行为所启发而总结出来 的.BFOA已经吸引了足够多的研究者的注意,由于它出现在解决真实世界中一些应用领域上优化问题的高效性.E.coli 的群体策略的生物基