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

为什么使用float而不是double不能提高Android的性能?,android,floating-point,Android,Floating Point,由于所有的智能手机(至少是我能找到规格的那些)都有32位处理器,我可以想象,在大量计算中使用单精度浮点值会比使用双倍值要好得多。然而,情况似乎并非如此 即使我避免类型转换,并尽可能使用FloatMath包,在比较基于浮点的方法和基于双基的方法时,除了内存使用之外,我几乎看不到任何性能改进 我目前正在开发一个相当大的、计算密集型的声音分析工具,它每秒进行数百万次乘法和加法运算。由于32位处理器上的双精度乘法需要几个时钟周期,而单精度乘法需要1个时钟周期,因此我假设类型的变化会很明显。。。但事实并非

由于所有的智能手机(至少是我能找到规格的那些)都有32位处理器,我可以想象,在大量计算中使用单精度浮点值会比使用双倍值要好得多。然而,情况似乎并非如此

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

我目前正在开发一个相当大的、计算密集型的声音分析工具,它每秒进行数百万次乘法和加法运算。由于32位处理器上的双精度乘法需要几个时钟周期,而单精度乘法需要1个时钟周期,因此我假设类型的变化会很明显。。。但事实并非如此:-(


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

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

许多手机都有包含FPU的CPU,但为了省电而禁用了FPU,这导致浮点操作的模拟速度较慢(在这种情况下,32位浮点将是一个优势)


还有一些向量单元具有32位FPU,导致64位浮点运算需要更长的时间在相同的时间内执行32位和64位操作,因此您一次可以执行两倍于32位操作的操作,但单个32位操作的速度不会比单个64位操作快。

许多(可能是大多数)Android设备没有浮点协处理器

我目前正在开发一个相当大的、计算密集型的声音分析工具,它每秒进行数百万次乘法和加法运算

在缺少浮点协处理器的Android设备上,这不会很好地工作

使用NDK将其移动到C/C++中,然后将您的目标限制为ARM7,它有一个浮点协处理器


或者,将您的数学更改为定点模式。例如,谷歌地图不处理纬度和经度的十进制度数,而是处理微度数(10^6倍度数),特别是这样它可以使用定点数学进行计算。

看起来您使用的是Nexus One,它有一个蝎子核心

我相信单精度和双精度标量浮点在Scorpion中都是完全管道化的,因此尽管操作的延迟可能不同,但吞吐量是相同的


也就是说,我相信Scorpion也有一个SIMD单元,它能够在浮点数上运行,但不能在双精度上运行。理论上,利用SIMD指令针对NDK编写的程序可以在单精度上比在双精度上运行快得多,但需要程序员付出巨大的努力。

好的,谢谢,我想这是有道理的。但我在我使用的设备(Nexus One-Quallcom QSD 8250 Snapdragon)中找不到FPU的任何规格。你知道我在哪里可以找到这种技术信息吗?这通常是错误的(许多现代x86系统使用SSE来做单精度浮点运算),而对于手机处理器(有些甚至不支持双精度,有些单精度比双精度快一个数量级)。@Stephen Canon:我说的是FPU(OP显然在使用FPU)。SSE是SIMD单元的一部分(许多ARM和x86 CPU都有这两个单元),而仿真显然没有使用FPU。我严格回答了OP的问题,没有写任何关于浮点数学的东西。但是在ARM设备上呢?第一个“ARM FPU”的搜索结果是的,这篇文章似乎说FPU是32位的:6年后仍然有效吗?@Sandstar:现在大多数Android设备都有浮点协处理器。尽管如此,我猜测“每秒数百万次乘法和加法”仍然需要特殊编码(NDK、RenderScript Compute等).这些FPU中有多少能够达到双精度或更高精度?@AaronFranke:对不起,我不知道。