我正在阅读一篇有关Swift的教程 (http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start),它建议不要显式设置类型,因为这种方式更易于阅读。
我并不完全同意这一点,但这不是我的问题。我的问题是:在性能方面(编译器...)是否显式设置类型更有效率?
例如,这样写:var hello: Int = 56
是否比这样写:var tutorialTeam = 56
更高效?
我正在阅读一篇有关Swift的教程 (http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start),它建议不要显式设置类型,因为这种方式更易于阅读。
我并不完全同意这一点,但这不是我的问题。我的问题是:在性能方面(编译器...)是否显式设置类型更有效率?
例如,这样写:var hello: Int = 56
是否比这样写:var tutorialTeam = 56
更高效?
使用显式类型和类型推断的代码在性能上没有区别。在每种情况下,编译输出是相同的。
当省略类型时,编译器会自动推断它。
在接受的答案中观察到的非常小的差异只是通常微型基准测试工具的产物,并且不能被信任!
是否包括显式类型是品味问题。在某些情况下,可能会使你的代码更易读。
唯一使你的代码有所区别的情况是当你想指定与编译器推断的不同类型时。例如:
var num = 2
上述代码表明num
是一个Int
,因为它被初始化为整数字面量。然而,你可以通过以下方式“强制”将其变成一个Double
:
var num: Double = 2
根据我的经验,在使用显式类型与隐式类型时,编译速度会有很大的性能影响。通过对变量进行显式类型化,我成功解决了大部分编译缓慢的代码。
似乎Swift编译器在这方面仍有改进的空间。尝试对你的一些项目进行基准测试,你会发现巨大的差异。
这里是我写的一篇关于如何加速Swift编译时间以及如何找到其原因的文章:如何加快Swift编译时间。
类型推断不会影响您所给出的示例中的性能。然而,我发现在Swift数组中明确指定类型确实会显著影响性能。
例如,下面的方法可以对一个类型为Any
的数组进行洗牌。
class func shuffleAny(inout array: [Any]) {
for (var i = 0; i < array.count; i++) {
let currentObject: Any = array[i]
let randomIndex = Int(arc4random()) % array.count
let randomObject: Any = array[randomIndex]
array[i] = randomObject;
array[randomIndex] = currentObject
}
}
上述函数实际上比如果我将此函数改为接受Int
数组的方式要慢得多,如下所示
class func shuffleIntObjects(inout array: [Int]) {
for (var i = 0; i < array.count; i++) {
let currentObject: Int = array[i]
let randomIndex = Int(arc4random()) % array.count
let randomObject: Int = array[randomIndex]
array[i] = randomObject;
array[randomIndex] = currentObject
}
}
使用 [Any]
的函数在处理100万个Int
对象时,计时为0.537秒,标准偏差为3%。而使用 [Int]
的函数在处理100万个Int
对象时,计时为0.181秒,标准偏差为2%。
您可以查看这个仓库(https://github.com/vsco/swift-benchmarks),其中详细介绍了Swift中更多有趣的基准测试。我最喜欢的之一是,在上述测试条件下,Swift泛型表现非常糟糕。
let a = 1
和let a:Int = 1
是完全等效的。如果您使用 alt+单击 检查a
,它将显示为Int
类型。 - Jack