1. 常用计算方法调优
a.整数取模
k = (j+rotdist)%n
替换为:
k = j + rotdist;
while( k>= n ) k -= n;
取模运算大概运行100ns,加减法运算一般在10ns左右,所以,当k/n< 5的时候,新算法比较快,当大于10以后,取模运算快速。
如果程序的运行时间主要消耗在输入输出上,那么对程序中的计算进行加速是毫无意义的。如果对内存的访问占用了大量的运行时间,那么减少计算时间同样是毫无意义的。
b. 函数,宏和内联函数
内联函数优先使用,函数次之,宏最后。
c. 顺序搜索
传统算法:
int search1(t)
for i = [0,n)
if x[i] == t
return i
return -1;
两个改进点,
1:在数组最后面添加一个标志位,从而可以免除每次循环开始时的判断,完全依靠break跳出循环。
2:将循环展开,一次循环,对个位置检测
int search3(t)
x[n] = t; //设置标志位,之前这个位置应该是没有用处的
for( i = 0;;i+=8)
if(x[i ] == t ) break;
if(x[i+1] == t ) { i+=1; break;}
if(x[i+2] == t ) { i+=2; break;}
if(x[i+3] == t ) { i+=3; break;}
if(x[i+4] == t ) { i+=4; break;}
if(x[i+5] == t ) { i+=5; break;}
if(x[i+6] == t ) { i+=6; break;}
if(x[i+7] == t ) { i+=7; break;}
if i == n
return-1
else
returni
减少检测数量,展开循环,大概可以降低运行时间60%。循环展开8最好,再大也没有太好的效果。
d. 计算球面距离
当算法解决出现问题时,考虑采用不同的数据结构表示数据,然后在此基础上进行代码调优。
2. 大手术-二分搜索
减少比较次数,展开循环到极致
3.原理
a.效率,不成熟的优化是大量编程灾难的根源。
b.度量工具,监视性能的陷阱。
c.设计层面,只有在确信没有更好的解决方案时才考虑进行代码调优。
d.双刃剑。玩火者,小心自焚。

浙公网安备 33010602011771号