ARM上除法比乘法执行慢

来源:互联网 发布:万得股票 mac 编辑:程序博客网 时间:2024/05/18 00:14

今天看ANDROID源码时看到这样一行代码“return value * metrics.xdpi * (1.0f/72);”,感觉很奇怪,为什么不直接除以72呢?难到手机上乘法比除法快,GOOGLE一下找到了下面说明:


不要使用除法

  您的游戏项目不应该执行单独的除法运算。ARM 处理器本身不支持除法运算。每次您进行除法运算的时候,它都会消耗数千个时钟周期。132 MHz 的 ARM 在理论上可以每秒执行 1.32 亿条指令(或者 2.64 亿条指令,如果其中一半运算是移位运算)。但是每秒 7 万次的除法运算就会超过 CPU 的最大能力。也就是说,如果您的游戏运行速度是每秒 70 帧,则对所绘制的每一帧进行 1,000 次除法运算就会达到处理器的最大能力。

  将所有除法都替换成移位和/或乘法运算。被 16 除可以改写为右移 4 位。更复杂的除法运算可以用移位和/或乘法的组合运算实现。

  也可以用查找表来执行除法运算。不过,如果分子和分母都是 32 位,所需的二维查找表就远远超出了可用的内存容量。一种解决方案就是缩小问题的范围。

  在表达式 a / b 中,可以在任何需要的位置插入一个“乘以 1”而不改变最终结果。这样 a * 1 / b 将产生完全相同的结果。另外也可以改变乘除法的顺序,将其写为 a * ( 1 / b ),这样,除法运算就被简化为 1 / b,它只需要一个一维的查找表。您还可以进一步简化查找表,方法是降低精度。我们先假设在大多数情况下 16 位的精度就已经足够,您的查找表只需要 64K 的项数。通过查找 b 中的 MSB(最高有效位),您可以使用此信息对 b 和结果进行向上或向下的移位以调整您的 32 位数值,同时保持最高的可能精度。即使加上由于随机访问除法查找表而造成的填充一条缓冲线的时间,最差的情况也将少于 100 个时钟周期。这个结果是编译器提供的标准除法效率的 20 倍,付出的代价是精度的一点点损失。

原创粉丝点击