如果我将浮点数除以整数,那么我有两种可能性:
var f : Float
val i : Int = 2
f = 1f / i
这里我通过说它是一个浮点数来“强制转换”第一个参数。然后,如果我正确地理解我是隐含的。
var f : Float
val i : Int = 2
f = 1 / i.toFloat()
这里我将第二个参数转换为float。然后,如果我正确地理解1也被渲染为浮动。
我的问题是,如果两种可能性中的第一种更快。或者我在两种情况下都有相同的表现?
答案 0 :(得分:3)
这里是两个片段的反编译字节码,其中的注释解释了两者之间不同的部分。
第一版:
L1
LINENUMBER 16 L1
ICONST_2
ISTORE 1
L2
LINENUMBER 17 L2
FCONST_1 // create constant float value 1f
ILOAD 1 // load value of i
I2F // cast i from int to float
FDIV // perform division
FSTORE 0 // write result to f
第二版:
L1
LINENUMBER 22 L1
ICONST_2
ISTORE 1
L2
LINENUMBER 23 L2
ICONST_1 // create constant int value 1
I2F // cast this value from int to float
ILOAD 1 // load value of i
I2F // cast i from int to float
FDIV // perform division
FSTORE 0 // write result to f
基本上,您在第一个版本中将int保存为float cast,因为您正在立即创建浮点常量1f
。
实际上,无论如何,这可以通过JVM轻松优化,并且在语法级别上不值得担心 - 只需使用哪个代码对您正在做的事情更具表现力。如果您以某种方式编写可以从性能改进中获益的代码,请对其进行分析,看看是否存在差异。
答案 1 :(得分:2)
两个片段之间的唯一区别是语法。没有可以在一个FP参数和一个整数参数上本地执行计算的CPU。始终首先将整数参数转换为FP。
如果你担心.toFloat()
部分,那又是语法。没有实际的方法调用,它只是将Int
表达式的类型更改为Float
。