为什么使用float而不是double不能提高Android性能?

时间:2011-02-24 11:22:59

标签: android floating-point

由于所有智能手机(至少是那些我可以找到规格的智能手机)都有32位处理器,我认为在大量计算中使用单精度浮点值的性能明显优于双精度。但是,情况似乎并非如此。

即使我避免使用类型转换,并且尽可能使用FloatMath包,在将基于浮点的方法与基于浮点的方法进行比较时,除了内存使用之外,我几乎看不到任何性能改进。

我目前正在研究一种相当大的计算密集型声音分析工具,它每秒进行数百万次乘法和加法。由于32位处理器上的双精度乘法需要几个时钟周期而单精度需要1,我假设类型更改会很明显......但它不是: - (

对此有一个很好的解释吗?这是由于Dalvik VM的工作方式还是什么?

3 个答案:

答案 0 :(得分:15)

典型CPU上的浮点单元以双精度(或更好)执行所有计算,并简单地舍入或转换为最终精度。换句话说,即使是32位CPU也有64位FPU。

许多手机都有包含FPU的CPU,但禁用了FPU以节省功耗,导致浮点运算被慢慢模拟(在这种情况下,32位浮点数将是一个优势)。

还有一些具有32位FPU的向量单元,导致64位浮点运算需要更长时间。一些SIMD单元(如那些执行SSE指令的单元)在相同的时间内执行32位和64位操作,因此您可以一次执行两次32位操作,但单个32位操作赢了不会比单个64位操作更快。

答案 1 :(得分:8)

很多(也许是大多数)Android设备都没有浮点协处理器。

  

我目前正在研究一种相当大的计算密集型声音分析工具,它每秒进行数百万次乘法和加法。

在没有浮点协处理器的Android设备上,这不会很好。

使用NDK将其移至C / C ++,然后将目标限制为ARM7,后者具有浮点协处理器。

或者,将数学更改为在定点模式下工作。例如,Google地图不会处理纬度和经度的十进制度数,而是处理微度度数(10 ^ 6度),特别是它可以使用定点数学进行计算。

答案 2 :(得分:3)

您似乎正在使用具有Scorpion核心的Nexus One。

我相信单精度和双精度标量浮点在Scorpion中完全流水线化,因此虽然操作的延迟可能不同,但吞吐量是相同。

那就是说,我相信Scorpion也有一个SIMD装置,可以在浮子上操作,但不能操作双打。从理论上讲,利用SIMD指令针对NDK编写的程序在单精度上比在双精度上运行速度要快得多,但只需要程序员付出巨大努力。