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
在对文档FloatMath
说:
数学例程类似于Math中的例程.直接对浮点值执行计算,而不会产生转换为double和从double转换的开销.
你的引语说:
在浮点运算时,出于性能原因,建议使用android.util.FloatMath
据推测FloatMath
,当你想要的时候float
,这种好处总是特别适用,但这种好处现在已经被否定了.
所以使用:
float foo = (float) Math.sin(bar);
Run Code Online (Sandbox Code Playgroud)
还要考虑如果性能如此重要以至于您需要担心这一点,那么转换到最终可能double
是有保证的(因为不会产生转换成本).
归档时间: |
|
查看次数: |
26608 次 |
最近记录: |