Java 使用FloatMath还是使用Math和cast?
在Android API的最新更新中,标记了以下lint警告: 在旧版本的Android中,使用Android.util.FloatMath是非常困难的 在浮子上操作时,出于性能原因,建议使用。然而, 在现代硬件上,双倍速度与浮点速度一样快(尽管需要 在Android的最新版本中,FloatMath实际上是 由于JIT优化的方式,比使用java.lang.Math慢 java.lang.Math。因此,如果需要,您应该使用Math而不是FloatMath 您的目标仅为Froyo及以上 还提到,在最近的硬件上,double和float在速度上是相等的 我在目前正在开发的应用程序中使用了一些三角数学(目标为Froyo及以上),但不需要高精度,因此到目前为止,我一直在使用浮点和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及以上 还提到,在
FloatMath
,根本不需要切换到双精度。但是,“使用
Math
overFloatMath
”-建议没有说明如果float是期望的结果,应该使用哪一个
简而言之,;哪一个更好
float foo = FloatMath.sin(bar);
或
顺便说一句,我只有一个Froyo设备,所以我不能自己做任何适当的基准测试
自API级别22起,FloatMath类已被弃用,取而代之的是常规数学类。比如:
类似于数学中的数学例程直接对浮点值执行计算,而不会产生与double之间的转换开销
你的报价是:
建议使用android.util.FloatMath,因为在浮点操作时性能原因
大概FloatMath
的好处总是特别适用于您想要float
的时候,但是现在这个好处已经被否定了
因此,请使用:
float foo = (float) Math.sin(bar);
也考虑到如果性能非常重要,你需要担心这个问题,也许切换到
sdouble
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