Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用FloatMath还是使用Math和cast?_Java_Android_Floating Point_Double_Android Lint - Fatal编程技术网

Java 使用FloatMath还是使用Math和cast?

Java 使用FloatMath还是使用Math和cast?,java,android,floating-point,double,android-lint,Java,Android,Floating Point,Double,Android Lint,在Android API的最新更新中,标记了以下lint警告: 在旧版本的Android中,使用Android.util.FloatMath是非常困难的 在浮子上操作时,出于性能原因,建议使用。然而, 在现代硬件上,双倍速度与浮点速度一样快(尽管需要 在Android的最新版本中,FloatMath实际上是 由于JIT优化的方式,比使用java.lang.Math慢 java.lang.Math。因此,如果需要,您应该使用Math而不是FloatMath 您的目标仅为Froyo及以上 还提到,在

在Android API的最新更新中,标记了以下lint警告:

在旧版本的Android中,使用Android.util.FloatMath是非常困难的 在浮子上操作时,出于性能原因,建议使用。然而, 在现代硬件上,双倍速度与浮点速度一样快(尽管需要 在Android的最新版本中,FloatMath实际上是 由于JIT优化的方式,比使用java.lang.Math慢 java.lang.Math。因此,如果需要,您应该使用Math而不是FloatMath 您的目标仅为Froyo及以上

还提到,在最近的硬件上,double和float在速度上是相等的

我在目前正在开发的应用程序中使用了一些三角数学(目标为Froyo及以上),但不需要高精度,因此到目前为止,我一直在使用浮点和
FloatMath
,根本不需要切换到双精度。
但是,“使用
Math
over
FloatMath
”-建议没有说明如果float是期望的结果,应该使用哪一个

简而言之,;哪一个更好

float foo = FloatMath.sin(bar);

顺便说一句,我只有一个Froyo设备,所以我不能自己做任何适当的基准测试

自API级别22起,FloatMath类已被弃用,取而代之的是常规数学类。比如:

类似于数学中的数学例程直接对浮点值执行计算,而不会产生与double之间的转换开销

你的报价是:

建议使用android.util.FloatMath,因为在浮点操作时性能原因

大概
FloatMath
的好处总是特别适用于您想要
float
的时候,但是现在这个好处已经被否定了

因此,请使用:

float foo = (float) Math.sin(bar);

也考虑到如果性能非常重要,你需要担心这个问题,也许切换到双是有必要的(不承担转换成本)。那么,您可能不想浪费时间在每次计算某项内容时来回转换

double
s

据我所知,在较旧的硬件上,浮点运算比双倍运算快,因此需要一个浮点运算的数学库。现在,“在现代硬件上,双精度运算与浮点运算一样快”,因此您应该使用双精度运算的默认
Math


如果值是浮点值对应用程序很重要(例如,由于内存消耗),则应继续使用FloatMath,因为
float foo=(float)Math.sin(bar),它会变得很烦人。

我最近刚刚研究了同一个问题,发现这个问题。
Math
函数的性能要比
FloatMath
函数好一个数量级,如下引号所示:

使用DDMS,我分析了有问题的代码。以下每个函数的调用次数均超过100次


如果您遵循AOSP树中的操作,您将看到在具有JIT的android版本上,使用
Math
函数比使用
FloatMath
更受欢迎,这基本上是Froyo(2.2)和更高版本中的任何内容。

从下面的结果中可以看出,使用java.lang.Math进行浮点运算比使用double更快,也比FloatMath更快。此外,FloatMath在API级别17之前没有.exp()或.pow()

在三星GT_i9295(4.2.2)上,2^24个周期

Math.exp(D)      Total:     7405 ms,     Per Op: 0.0004414 ms
(F)Math.exp(F)   Total:     5153 ms,     Per Op: 0.0003071 ms
FloatMath.exp(F) Total:     8533 ms,     Per Op: 0.0005086 ms
三星没有Math.sin的数据,因为它随机决定忽略Log.d()>:(

在HTC Hero_HT99VL(2.3.7)上,2^12个循环

Math.sin(D)      Total:       42 ms,     Per Op: 0.0102539 ms
(F)Math.sin(F)   Total:       33 ms,     Per Op: 0.0080566 ms
FloatMath.sin(F) Total:       38 ms,     Per Op: 0.0092773 ms

Math.exp(D)      Total:       56 ms,     Per Op: 0.0136719 ms
(F)Math.exp(F)   Total:       47 ms,     Per Op: 0.0114746 ms

FloatMath.exp()、.pos()和.hypot()需要API级别17

我认为您引用的文本意味着,如果float是理想的结果,您应该使用math而不是floatmath和cast。我愿意接受任何关于
int
/
float
/
double
的相对性能的声明,因为有一个非常大的盐粒。
float
可能会稍微快一点,因为sma在iPhone3GS上,
float
的速度要快得多,因为它可以使用霓虹灯单元,而不是较慢的VFP单元(霓虹灯单元不支持双倍);这可能是特定于iDevice的。此外,自动矢量化JIT将自动受益于
float
而不仅仅是
double
,因为它可以在每个向量寄存器中容纳更多的变量。可能是因为在最新的Android设备上,float都存储为double吗?!
FloatMath
-。等等,直到API 22,不包括,FloatMath更好了,现在Math更好了?如果是这样,让它使用基于API的更好的解决方案难道不是更有意义吗?如果现在在操作double或float方面没有区别,那么将float转换为double仍然会有开销,反之亦然。因此使用Math会导致从一种类型转换为另一种类型,并且FloatMath将直接对浮点数进行操作。那么为什么使用Math更好呢?一些数学方法将双精度作为参数,因此也会发生一些隐式转换。@Egor我不知道使用
Math
比前面提到的更好的确切原因,我只是说文档和lint警告似乎暗示了这一点即使考虑到转换成本,您也应该在
FloatMath
上使用
Math
。此外,通常仅使用
double
而不是
float
,除非空间是个问题。
Math.exp(D)      Total:     7405 ms,     Per Op: 0.0004414 ms
(F)Math.exp(F)   Total:     5153 ms,     Per Op: 0.0003071 ms
FloatMath.exp(F) Total:     8533 ms,     Per Op: 0.0005086 ms
Math.sin(D)      Total:       42 ms,     Per Op: 0.0102539 ms
(F)Math.sin(F)   Total:       33 ms,     Per Op: 0.0080566 ms
FloatMath.sin(F) Total:       38 ms,     Per Op: 0.0092773 ms

Math.exp(D)      Total:       56 ms,     Per Op: 0.0136719 ms
(F)Math.exp(F)   Total:       47 ms,     Per Op: 0.0114746 ms