浮点数学类的替代方法

时间:2016-03-08 08:00:28

标签: java android kotlin

使用此样式的函数会产生性能问题吗?:

*fun sqrt(x: Float) = Math.sqrt(x.toDouble()).toFloat()*

*fun cos(angle: Float) = Math.cos(angle.toDouble()).toFloat()*

*fun sin(angle: Float) = Math.sin(angle.toDouble()).toFloat()*

使用Floats:

*sqrt(45.0f)*

*cos(1.58f)*

*sin(0.28f)*

而不是更冗长:

*Math.sqrt(45.0f.toDouble()).toFloat()*

*Math.cos(1.58f.toDouble()).toFloat()*

*Math.sin(0.28f.toDouble()).toFloat()*

提前问候和致谢

4 个答案:

答案 0 :(得分:2)

使用包装器时应该没有性能问题

由于调用这些函数(它们是静态调度的,就像任何实用程序方法一样),性能可能会略微降低。

如果您使用 hot 代码中的包装,那么您可以内联它们:

inline fun sqrt(x: Float) = Math.sqrt(x.toDouble()).toFloat()

对于内联函数,字节代码与Java生成的字符代码没有区别。

答案 1 :(得分:1)

我认为使用Math类没有问题。在早期的Android版本中,有一个类android.util.FloatMath来处理浮点运算,但现在普通的Math类更快,并且不推荐使用该类。

  

历史上,这些方法比同等的基于双的Math方法更快。在带有JIT的Android版本中,它们变慢了,并且已经重新实现以包装对Math的调用。应优先使用数学。   所有方法都从版本23中的公共API中删除。

http://developer.android.com/reference/android/util/FloatMath.html

答案 2 :(得分:0)

据我了解表现,它是通过算法的复杂程度来衡量的 在n个元素阵列上的算法,对每个元素执行1次操作,据说具有O(n)复杂度 相同的算法复杂度,对每个元素执行3次操作仍然是O(n)
固定操作(如.toFloat.toDouble())不会影响性能,因为它们具有O(1)复杂性。

答案 3 :(得分:0)

事实上,尝试:

var iniTemp = System.currentTimeMillis()
for (i in 1..10000000)
  sqrt(755.369f)
d((System.currentTimeMillis() - iniTemp).toString())

407 milisecs

var iniTemp = System.currentTimeMillis()
for (i in 1..10000000)
  Math.sqrt(755.369f.toDouble()).toFloat()
d((System.currentTimeMillis() - iniTemp).toString())

317 milisecs

在较旧的Nexus 7中

由于