表达式优化:
加减法是计算机最喜欢的操作 执行时间为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++)