高频率调用的函数一定要保证最优化,慎用除法和余数
来源:互联网 发布:java解析json数组数据 编辑:程序博客网 时间:2024/06/07 15:39
转自: http://blog.csdn.net/mustanglau/article/details/4767937
在近期优化系统的过程中,发现有个函数在高压力下,竟然占用13.3%的时间,这个函数内部很简单,基本就是这样:
id_to_type(id)
{
}
核心基本上就在这个%取余上,这往往使我们分组提高效率的常用方法,但是对于高频率调用上,则可以避免了。
如何解决呢?下面的附录说明了一些替代方法,但是显然并不是符合我们现在要解决的这个问题,当前我采用了修改设计的方法,将type合入到id的一 部分钟,必须 id 0x10000000 表示type=0的非等最大值,0x20000000表示type=1的非等最大值。
=============附录============
(说明:文章中的很多数据可能在新的CPU或不同的CPU或不同的系统环境下有不同的结果,可能不能面面俱到)
x86系列的CPU对于位运 算、加、减等基本指令都能在1个CPU周期内完成(现在的CPU还能乱序执行,从而使指令的平均CPU周期更小);现在的CPU,做乘法也是很快的(1个 CPU周期左右,或者是需要两/三个周期,但每个周期能启动一个新的乘指令),但作为基本指令的除法却超出很多人的预料,它是一条很慢的操作,整数和浮点 的除法都慢;我测试的英特尔P5赛扬CPU浮点数的除法差不多是37个CPU周期,整数的除法是80个CPU周期,AMD2200+浮点数的除法差不多是 21个CPU周期,整数的除法是40个CPU周期。(改变FPU运算精度对于除法无效)(SSE指令集的低路单精度数除法指令DIVPS 18个CPU周期,四路单精度数除法指令DIVSS 36个CPU周期)