划分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 优化,并且在语法级别上不值得担心 - 只需使用对您正在做的事情更具表现力的代码即可。如果您以某种方式编写的代码会受益于如此微小的性能改进,请对其进行分析以查看是否存在某种差异。
如果我将一个浮点数除以一个整数,那么我有两种可能的转换方式:
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 优化,并且在语法级别上不值得担心 - 只需使用对您正在做的事情更具表现力的代码即可。如果您以某种方式编写的代码会受益于如此微小的性能改进,请对其进行分析以查看是否存在某种差异。