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