使用FloatMath或Math和演员?

Jav*_*ave 36 java floating-point double android android-lint

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

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

这里还提到double和float在最近的硬件上速度相等.

我在我正在使用的应用程序中使用一些三角数学(目标是Froyo及以上),但是不需要高精度,所以我一直在使用浮点数,FloatMath到目前为止,没有必要切换到双打.
但是,如果float是期望的结果,则"使用Math结束FloatMath" - 推荐不会说明使用哪一个.

所以,简而言之; 哪一个更好?

float foo = FloatMath.sin(bar);
Run Code Online (Sandbox Code Playgroud)

要么

float foo = (float) Math.sin(bar);
Run Code Online (Sandbox Code Playgroud)

另外,我只有一个Froyo设备,所以我不能自己做任何适当的基准测试.

从API级别22开始,不推荐使用FloatMath类来支持常规Math类.

小智 15

从下面的结果中可以看出,使用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
Run Code Online (Sandbox Code Playgroud)

没有关于三星上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
Run Code Online (Sandbox Code Playgroud)

FloatMath.exp(),. as()和.hypot()需要API级别17


kab*_*uko 5

对文档FloatMath说:

数学例程类似于Math中的例程.直接对浮点值执行计算,而不会产生转换为double和从double转换的开销.

你的引语说:

在浮点运算时,出于性能原因,建议使用android.util.FloatMath

据推测FloatMath,当你想要的时候float,这种好处总是特别适用,但这种好处现在已经被否定了.

所以使用:

float foo = (float) Math.sin(bar);
Run Code Online (Sandbox Code Playgroud)

还要考虑如果性能如此重要以至于您需要担心这一点,那么转换到最终可能double是有保证的(因为不会产生转换成本).

  • @Egor我不知道究竟为什么使用`Math`比使用上面提到的更好的细节,我只是说文档和lint警告似乎暗示你应该使用`Math`而不是'FloatMath`甚至在考虑转换成本时.另外,一般情况下只使用`double`而不是`float`是[推荐](http://developer.android.com/training/articles/perf-tips.html#AvoidFloat),除非空间有问题. (3认同)