Swift 数组边界检查优化的工作原理
How Swift Array Bounds Checks Optimization works
我在看WWDC 2015 session 409 - Optimizing Swift Performance 。它提到 Swift 确保数组访问发生在边界内。 Swift 可以解除检查循环。这样 O(n) 次检查就变成了 O(1).
演讲中的示例如下所示:
//Before Optimization
for i in 0..<n {
precondition (i < length)
A[i] ^= 13
}
//After Optimization
precondition (i < length)
for i in 0..<n {
A[i] ^= 13
}
根据我的理解,编译器应该在编译代码时执行所谓的数组边界检查。但是当我使用以下代码进行测试时,我没有看到编译器的警告。相反,它在运行时崩溃了。
var a = Array(1...5)
for i in 0..<6 {
a[i] ^= 13
}
我确实在构建设置下将禁用安全检查设置为否。我认为这应该打开数组边界检查。任何人都知道为什么?
演讲中的示例显示了 precondition() 的使用,但您的代码似乎没有使用 precondition()
我在看WWDC 2015 session 409 - Optimizing Swift Performance 。它提到 Swift 确保数组访问发生在边界内。 Swift 可以解除检查循环。这样 O(n) 次检查就变成了 O(1).
演讲中的示例如下所示:
//Before Optimization
for i in 0..<n {
precondition (i < length)
A[i] ^= 13
}
//After Optimization
precondition (i < length)
for i in 0..<n {
A[i] ^= 13
}
根据我的理解,编译器应该在编译代码时执行所谓的数组边界检查。但是当我使用以下代码进行测试时,我没有看到编译器的警告。相反,它在运行时崩溃了。
var a = Array(1...5)
for i in 0..<6 {
a[i] ^= 13
}
我确实在构建设置下将禁用安全检查设置为否。我认为这应该打开数组边界检查。任何人都知道为什么?
演讲中的示例显示了 precondition() 的使用,但您的代码似乎没有使用 precondition()