使用此样式的函数会产生性能问题吗?:
*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()*
提前问候和致谢
答案 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中
由于