Swift 变量条件初始化: var with default value or let?
Swift variable conditional initialization: var with default value or let?
如果变量在初始化后永远不会发生变化,var
是否会影响性能?有些情况写起来更简单
var value = 0
if conditions {
value = 1
}
比
let value: Int
if conditions {
value = 1
} else {
value = 0
}
可以忽略不计吗?
你可以自己检查一下,使用诸如godbolt之类的编译器资源管理器。
Compiled assembly from both methods本质上是一样的,只是跳转的地方不同,所以应该没有任何性能差异。
虽然变量的范围很重要,但在谈论局部变量时,编译器应该能够将可变局部变量优化为与不可变局部变量相同的编译代码(假设您的原始示例),但是在谈论实例时例如属性,情况不再一定如此。一个变量的范围越大,如果你声明它是可变的,就越难推断它是否曾经发生过变异。
现代编译器采用巧妙而高效的优化,因此除非您在非常受限的硬件环境(例如带有微控制器的嵌入式系统)中工作,而使用 Swift 进行开发时通常不会出现这种情况,否则您不应该不要考虑这种微观优化(或者更确切地说是过早的优化)。
如果变量在初始化后永远不会发生变化,var
是否会影响性能?有些情况写起来更简单
var value = 0
if conditions {
value = 1
}
比
let value: Int
if conditions {
value = 1
} else {
value = 0
}
可以忽略不计吗?
你可以自己检查一下,使用诸如godbolt之类的编译器资源管理器。
Compiled assembly from both methods本质上是一样的,只是跳转的地方不同,所以应该没有任何性能差异。
虽然变量的范围很重要,但在谈论局部变量时,编译器应该能够将可变局部变量优化为与不可变局部变量相同的编译代码(假设您的原始示例),但是在谈论实例时例如属性,情况不再一定如此。一个变量的范围越大,如果你声明它是可变的,就越难推断它是否曾经发生过变异。
现代编译器采用巧妙而高效的优化,因此除非您在非常受限的硬件环境(例如带有微控制器的嵌入式系统)中工作,而使用 Swift 进行开发时通常不会出现这种情况,否则您不应该不要考虑这种微观优化(或者更确切地说是过早的优化)。