小培

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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.双刃剑。玩火者,小心自焚。

posted on 2010-11-03 20:01  小培  阅读(239)  评论(0)    收藏  举报