程序中的基本优化

表达式优化:

加减法是计算机最喜欢的操作  执行时间为1个时钟周期,其次位运算的速度与加减操作接近,乘法为5-6个时钟周期,注意了 除法操作为50个时钟周期

所以在一个表达式中尽量用加减或位运算替换乘除操作,

比如 a*13等于 a<<3+a<<2+a  (向左移1位乘等于2) 任何乘法都可以改写位运算  但是除法只适用于除数恰好是2的n次幂,比如8/13就无能为力了


使用数学公式优化,比如求 1+2+.....n

很普通的想法就是  一个for  从1一直累加到n  这样就需要n次循环,还有n次加法操作,还有n次条件判断,一共消耗300个时间周期;

如果换成高斯公式 (n+1)*n/2只需要做一次加法  一次乘法 一个除法 ,当n很大时,效率是很明显的


x=x+1  和x+=1  看似不起眼的一个习惯   其实也存在效率的问题    计算机中读取速度:寄存器》内存》硬盘

编译器的执行流程:  前者,寻找左边x所在内存单元地址 寻找右边x所在内存单元地址  右边x+1在把结果存到左边x内存单元(其实两个x本来就是同一个,但是编译器并不知道 还傻傻的去找两次,两次找出来的地址都是同一个)

后者,  表达式里面只出现了一次x  所以编译器直接去找x的内存单元地址,计算x+1保存结果 

看的出来前者在多读了一次内存  淡淡一条并看不出差别 假设一下你在循环一个有5W条数据的数据库,还是有感觉的

分支优化:

有一篇英文小说  现在有个需求统计里面  字母  数字 空格的个数,

普通想法  先转化为数组    循环一边    if(数字) num++  else if(空格) bnk++  else if(字符) chr++

看似很平淡   仔细一想既然是英文文章 那么出现最多的应该是 字母其次是空格  所以把上面的if条件改变一下位置    if(字母) chr++ else if(空格)  bnk++  else if(数字) num++  

第一种判断方式  大部分要判断三次   而第二种方式大部分只需要判断两次


一次性计算

一个很常见的例子

for(int i=0;i<strlen(arr),i++) 

这个例子 每次循环 都要判断条件  判断条件就要计算strlen(arr);  下面的写法可以减少计算

int len = strlen(arr)

for( int i = 0 ; i< len ; i++)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章