使用FloatMath还是Math和cast?

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

在较旧版本的Android中,出于性能原因,建议使用android.util.FloatMath在浮点数上运行。然而,在现代硬件上,双精度与float一样快(尽管它们占用更多内存),并且在最新版本的Android中,由于JIT优化java.lang.Math的方式,FloatMath实际上比使用java.lang.Math慢。因此,如果您只针对Froyo及以上版本,则应使用Math而不是FloatMath。

这里还提到,在最近的硬件上,双倍和浮点在速度上是相等的。

我正在我正在使用的应用程序中使用一些三角数学(针对Froyo及以上),但不需要高精度,所以我一直在使用浮点数,到目前为止,没有必要切换到双精度。
但是,“使用超过”-建议并没有说明如果浮点数是所需的结果,则使用哪一个。FloatMathMathFloatMath

因此,简而言之;哪一个更可取?

float foo = FloatMath.sin(bar);

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

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

从API级别22开始,FloatMath类已被弃用,取而代之的是常规的数学类。


答案 1

从下面的结果中可以看出,使用java.lang.Math对于浮点数比使用双精度更快,比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


答案 2

FloatMath的文档说:

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

你的报价说:

出于性能原因,建议使用 android.util.FloatMath 在浮点数上操作时

据推测,的好处总是专门用于当你想要一个时,但这个好处现在被否定了。FloatMathfloat

所以使用:

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

还要考虑,如果性能如此关键,以至于您需要担心这一点,那么也许毕竟需要切换到(以免产生转换成本)。double