Android 浮动还是双倍?

Android 浮动还是双倍?,android,performance,memory,floating-point,Android,Performance,Memory,Floating Point,在执行算术运算(+-*/%)时,哪一种速度更快,是双精度还是浮点型?出于内存原因,是否值得仅使用浮点型?精确性不是问题,而是很大的问题 你可以随便说我疯了,因为我想这个。奇怪的是,我看到我使用的浮动量越来越大 编辑1: 这是在安卓系统下的唯一原因,因为我认为这就是记忆的重要性所在;对于桌面开发,我甚至不会要求这样做。对于快速操作,我也不建议这样做,但我相信浮点数上的操作会更快,因为它们是32位对64位的双倍运算。浮点数是32位或4字节 双精度是64位或8字节 因此,是的,根据sun java认证

在执行算术运算(+-*/%)时,哪一种速度更快,是双精度还是浮点型?出于内存原因,是否值得仅使用浮点型?精确性不是问题,而是很大的问题

你可以随便说我疯了,因为我想这个。奇怪的是,我看到我使用的浮动量越来越大

编辑1:
这是在安卓系统下的唯一原因,因为我认为这就是记忆的重要性所在;对于桌面开发,我甚至不会要求这样做。

对于快速操作,我也不建议这样做,但我相信浮点数上的操作会更快,因为它们是32位对64位的双倍运算。

浮点数是32位或4字节

双精度是64位或8字节


因此,是的,根据sun java认证书,浮点的大小是它的一半。

现在在CPU中,这两种类型的处理速度应该大致相同。

“使用可接受结果所需的精度。”

相关问题在这里已经被问了好几次了,所以

编辑:

在速度方面,在更现代的硬件上,float和double没有区别


请从developer.android.com上查看此消息。

ADT v21 lint消息建议使用Double而不是Float,因为从Froyo开始,Dalvik中的JIT(准时)优化(API 8和更高版本)

我使用了FloatMath.sin,它在“解释问题”上下文菜单下建议使用Math.sin。在我看来,这就像是一条关于双vs浮点的一般信息,而不仅仅是与trig相关的信息

“在旧版本的Android中,使用 建议将android.util.FloatMath用于 在浮动上操作时的性能原因。 然而,在现代硬件上,翻倍速度同样快 作为float(尽管它们占用更多内存),并且 Android的最新版本,FloatMath实际上是 由于JIT的方式,比使用java.lang.Math慢 优化java.lang.Math 数学而不是浮动数学,如果你只针对 弗罗约及以上。“


希望这能有所帮助。

我也对此感到好奇,并编写了一个小测试:

#include <iostream>
#include <chrono>

template<typename numType>
void test(void)  {
    std::cout<< "Size of variable: " << sizeof(numType) << std::endl;
    numType array[20000];

    auto t1 = std::chrono::high_resolution_clock::now();
    // fill array
    for( numType& number : array ) {
        number = 1.0014535;
    }

    auto t2 = std::chrono::high_resolution_clock::now();

    // multiply each number with itself 10.000 times
    for( numType& number : array ) {
        for( int i=0; i < 10000 ; i++ )  {
            number *= number;
        }
    }

    auto t3 = std::chrono::high_resolution_clock::now();

    auto filltime = t2 - t1;
    auto calctime = t3 - t2;

    std::cout<< "Fill time: " << filltime.count() << std::endl;
    std::cout<< "Calc time: " << calctime.count() << std::endl;
}

int main(int argc, char* argv[]) {
    test<float>();
    test<double>();
}
结果是可复制的。因此,double的内存分配需要稍长的时间,但实际计算时间完全相同


出于好奇,我还使用Visual Studio 2012在英特尔i7 920处理器上以发布模式在Windows 7 x64下运行并编译了它

(时间单位不同,因此不要将上述结果与这些结果进行比较:它仅对内部比较有效)

结果是可复制的

windows上的分配似乎是即时的,这可能是因为linux在您使用它之前不会给您内存,而windows只是一次将内存全部交给您,需要的系统调用更少。或者,任务被优化了

这里的双精度乘法比浮点数慢21.5%。与上一次测试的差异可能是由于处理器不同(至少这是我最好的猜测)

在速度方面,在更现代的硬件上,float和double没有区别

非常便宜的设备似乎有一个有限的FPU,浮动速度超过两倍。我在CMX设备上进行了测试,该设备目前是世界上最便宜的平板电脑之一:

  • “浮动”测试代码需要4.7秒
  • 使用“double”的相同代码需要6.6秒
这个问题已经被问了好几次了

对。因为对于不同类型的硬件,答案是不同的。在台式计算机上,double的速度与float相同。在没有FPU(对WLAN路由器黑客来说很有趣)的设备上,浮点运算速度是双倍运算速度的2-5倍;并且在具有32位FPU(通常在工业和汽车应用中发现)的设备上,甚至达到100倍

请查看这篇文章

文章的最后一节说,您必须在要使用的硬件设备上进行时间测量,才能100%确定。

避免使用浮点值

根据经验,浮点运算比整数运算慢2倍左右 Android驱动的设备

在速度方面,浮球和双球在速度上没有区别 更现代化的硬件。从空间上看,double要大2倍。和桌面一样 机器,假设空间不是问题,您应该更喜欢双人而不是 浮动

此外,即使对于整数,有些处理器也有硬件乘法,但 缺乏硬件划分。在这种情况下,整数除法和模 操作是在软件中执行的,如果 你正在设计一个哈希表或者做很多数学运算


引用的android文档表明,对于快速操作,整数更可取。从表面上看,这似乎有点奇怪,但使用ints vs float vs double的算法的速度取决于几个层次:

  • JIT或VM:它们将数学运算转换为主机的本机指令集,这种转换会对性能产生很大影响。由于底层硬件可能因平台而异,因此很难编写在所有情况下都能发出最佳代码的VM或JIT。可能仍然最好使用JIT/VM推荐的快速类型(在本例中为整数),因为随着JIT和VM更好地发出更高效的本机指令,您的高级代码应该在不做任何修改的情况下获得相关的性能提升

  • 本机硬件(为什么第一级不是完美的):现在大多数处理器都有硬件浮点单元(支持浮点和双精度)。如果存在这样的硬件单元,浮点/双精度运算可能比整数快,除非还支持硬件整数。使问题更加复杂的是,大多数CPU都有某种形式的SIMD(单指令多数据)支持,允许对操作进行矢量化
    Size of variable: 4
    Fill time: 69
    Calc time: 694303
    
    Size of variable: 8
    Fill time: 76
    Calc time: 693363
    
    Size of variable: 4
    Fill time: 0
    Calc time: 3200183
    
    Size of variable: 8
    Fill time: 0
    Calc time: 3890223