如何在分割float和int时进行性能转换?

时间:2018-01-23 12:31:42

标签: casting floating-point kotlin division

如果我将浮点数除以整数,那么我有两种可能性:

var f : Float
val i : Int = 2
f = 1f / i

这里我通过说它是一个浮点数来“强制转换”第一个参数。然后,如果我正确地理解我是隐含的。

var f : Float
val i : Int = 2
f = 1 / i.toFloat()

这里我将第二个参数转换为float。然后,如果我正确地理解1也被渲染为浮动。

我的问题是,如果两种可能性中的第一种更快。或者我在两种情况下都有相同的表现?

2 个答案:

答案 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