swift - Switch 语句中 Case 的顺序对 Swift 中的执行速度有影响吗?

标签 swift

考虑到某个情况在统计上比其他情况更有可能,如果将该“情况”放在 Switch 语句的第一位,执行速度会更快吗?

从逻辑上来说应该是这样,但我一直在运行一些基准测试,但我看不出有多大区别。 Switch/Case 是利用“案例”比其他案例更有可能这一事实的最佳方式吗?

最佳答案

这很容易测试:

struct MyInteger {
    let value: Int
}

func ~=(a: Int, b: MyInteger) -> Bool {
    println("Evaluating pattern \(a)")

    return (a == b.value)
}

for i in 0...3 {
    let number = MyInteger(value: i)

    switch (number) {
        case 0:
            println("Case 0")
        case 1:
            println("Case 1")
        case 2:
            println("Case 2")
        default:
            println("Default branch")
    }
}

输出为

Evaluating pattern 0
Case 0
Evaluating pattern 0
Evaluating pattern 1
Case 1
Evaluating pattern 0
Evaluating pattern 1
Evaluating pattern 2
Case 2
Evaluating pattern 0
Evaluating pattern 1
Evaluating pattern 2
Default branch

因此,case 语句的顺序很重要,并且只有在我们找到一个计算结果为 true 时才会对它们进行求值。

这也是为什么 default 语句必须始终是最后一个的原因(这在 Java 或 C 等语言中并不强制执行,其中 switch 只是一个跳转表) .

每个 case 都是对模式匹配函数 ~=(或多个)的调用。

关于swift - Switch 语句中 Case 的顺序对 Swift 中的执行速度有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006955/

相关文章:

Swift CSVImporter 无法在属性中使用实例成员路径

ios - 仅显示折线

ios - 将应用上传到应用商店后出错

ios - 当我在 numberOfItemsInSection 中返回 1 时,cellForItemAt 未在 Swift 中调用

ios - CGContextDrawImage错误,如何分配缓冲区?

ios - 如何使用 dx 和 dy(导数)创建 Swift CGVector?

ios - Swift xcode 错误 : Thread 1: EXC_BAD_ACCESS (code=2, 地址=0x7ff54b59ff8)

ios - 确定在哪个 TableView 中按下了单元格按钮?

ios - 无法将自身(实现协议(protocol))传递给类实例化的 init 方法。(Swift)

swift - Firebase & swift 使用.indexOn 对数据快照进行排序