赋值 vs if not equal to then assign... Swift 是我最关心的语言
Assignment vs if not equal to then assign... Swift being the language I care most about
我有一些代码会经常得到 运行。就性能而言,以下语句之间有什么区别吗?如果有,哪个更快?
num = 4
对
if num != 4 {
num = 4
}
我知道差异可能很小,但我有时会想到这个问题 运行。此外,我会对与此密切相关的问题感兴趣,这些问题可能使用 Bool
或 String
而不是 Int
.
我相信这张支票
if num != 4 { ... }
如果比作业快
num = 4
场景#1
所以如果大多数时候 num
是 等于 到 4
你应该跳过无用的分配并使用这个代码
if num != 4 {
num = 4
}
场景 #2
另一方面,如果大多数时候 num
与 4
不同,您可以删除检查并突出分配
num = 4
我阅读速度更快"num = 4"。大约快三倍。这就是我关心的。您正在尝试对非常可疑的价值进行微观优化,所以如果我看到有人编写那种代码,我会非常担心。
第一个肯定更快,因为处理器必须执行 1 条指令,这需要 1 个时钟周期。在第二个中,至少有 1 条或更多条指令(比较和可选赋值)。
假设我们有这样的代码:
var x = 0
x = 4
以下是程序集的重要行 (swiftc -emit-assembly
):
movq [=11=], __Tv4test3numSi(%rip) // Assigns 0 to the variable
movq , __Tv4test3numSi(%rip) // Assigns 4 to the variable
如您所见,只需要一条指令
并使用此代码:
var x = 0
if x != 4 {
x = 4
}
程序集:
movq [=13=], __Tv4test3numSi(%rip) // Assign 0 to the variable
cmpq , __Tv4test3numSi(%rip) // Compare variable with 4
je LBB0_4 // If comparison was equal, jump to LBB0_4
movq , __Tv4test3numSi(%rip) // Otherwise set variable to 4
LBB0_4:
xorl %eax, %eax // Zeroes the eax register (standard for every label)
如您所见,第二个使用 3 条指令(当已经等于 4 时)或 4 条指令(当不等于 4 时)。
从一开始我就很清楚,但程序集很好地证明了第二个不能再快了。
我有一些代码会经常得到 运行。就性能而言,以下语句之间有什么区别吗?如果有,哪个更快?
num = 4
对
if num != 4 {
num = 4
}
我知道差异可能很小,但我有时会想到这个问题 运行。此外,我会对与此密切相关的问题感兴趣,这些问题可能使用 Bool
或 String
而不是 Int
.
我相信这张支票
if num != 4 { ... }
如果比作业快
num = 4
场景#1
所以如果大多数时候 num
是 等于 到 4
你应该跳过无用的分配并使用这个代码
if num != 4 {
num = 4
}
场景 #2
另一方面,如果大多数时候 num
与 4
不同,您可以删除检查并突出分配
num = 4
我阅读速度更快"num = 4"。大约快三倍。这就是我关心的。您正在尝试对非常可疑的价值进行微观优化,所以如果我看到有人编写那种代码,我会非常担心。
第一个肯定更快,因为处理器必须执行 1 条指令,这需要 1 个时钟周期。在第二个中,至少有 1 条或更多条指令(比较和可选赋值)。
假设我们有这样的代码:
var x = 0
x = 4
以下是程序集的重要行 (swiftc -emit-assembly
):
movq [=11=], __Tv4test3numSi(%rip) // Assigns 0 to the variable
movq , __Tv4test3numSi(%rip) // Assigns 4 to the variable
如您所见,只需要一条指令
并使用此代码:
var x = 0
if x != 4 {
x = 4
}
程序集:
movq [=13=], __Tv4test3numSi(%rip) // Assign 0 to the variable
cmpq , __Tv4test3numSi(%rip) // Compare variable with 4
je LBB0_4 // If comparison was equal, jump to LBB0_4
movq , __Tv4test3numSi(%rip) // Otherwise set variable to 4
LBB0_4:
xorl %eax, %eax // Zeroes the eax register (standard for every label)
如您所见,第二个使用 3 条指令(当已经等于 4 时)或 4 条指令(当不等于 4 时)。
从一开始我就很清楚,但程序集很好地证明了第二个不能再快了。