Switch语句中的Cases的顺序是否会对Swift中的执行速度产生影响?

时间:2014-07-29 01:33:59

标签: swift

鉴于案例在统计上比其他案例更可能,如果将“案例”放在Switch语句中,那么执行会更快吗?

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

2 个答案:

答案 0 :(得分:2)

测试非常简单:

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都是对模式匹配函数~=(或更多)的调用。

答案 1 :(得分:0)

这证明了案件按照他们的写作顺序进行评估:

func testing(a : Int)->Int{
    println(a)
    return a
}

let x = 2

switch x {
    case testing(1) :
        println("one")
    case testing(2) :
        println("two")
    case testing(3) :
        println("three")
    case testing(4) :
        println("four")
    default:
        println("Default")
}

打印:

1
2
two

如果您要评估以下情况,请使用关键字fallthrough