ARM上除法比乘法执行慢

今天看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 倍,付出的代价是精度的一点点损失。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值