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

How to cast perforrmantly when dividing float and int?

如果我将一个浮点数除以一个整数,那么我有两种可能的转换方式:

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

这里我"cast"说第一个参数是float。然后,如果我正确理解 i 是隐式转换的。

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

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

我的问题是这两种可能性中的第一种是否更快。或者我在这两种情况下的表现是否相同?

你的两个片段之间的唯一区别是语法。没有 CPU 可以在一个 FP 参数和一个整数参数上本地执行计算。整数参数总是首先转换为 FP。

如果您担心 .toFloat() 部分,那也只是语法问题。没有实际的方法调用在进行,它只是将 Int 表达式的类型更改为 Float.

这是两个片段的反编译字节码,注释解释了两者之间的不同部分。

第一个版本:

   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,因为您正在立即创建一个 float 常量 1f

但实际上,无论如何,这可以很容易地由 JVM 优化,并且在语法级别上不值得担心 - 只需使用对您正在做的事情更具表现力的代码即可。如果您以某种方式编写的代码会受益于如此微小的性能改进,请对其进行分析以查看是否存在某种差异。