开关性能是否超过枚举情况O(1)

时间:2019-06-05 18:25:38

标签: swift performance enums

在所有枚举情况下,我都无法获得有关switch语句性能的信息。假设您有100箱。是O(1)吗?

enum MyEnum {
    case one = 1
    case two = 2
}

let myEnum = MyEnum.one
switch myEnum {
    case .one: ...
    case .two: ...
}

1 个答案:

答案 0 :(得分:1)

查看switch语句的汇编代码(“调试”»“调试工作流”»“始终显示反汇编”),可以看到它是O(1)(至少在这种简单情况下) , 至少)。例如,下面是switch代码:

enter image description here

不要迷失于该代码中,但请注意,很少有指令将rdx的内容设置为与该特定case关联的代码的地址:

enter image description here

这里的细节并没有真正的意义,但是关键是在我的1,000个枚举的枚举中,它没有经过1,000次测试,而是通过从该枚举中的索引计算得出地址,然后跳转到相关代码。


所有这些,枚举通常没有足够多的情况,以至于无法观察到switch语句的复杂性。而且如果您确实有成千上万(或数百万)个不同的案例,那么代码中还会有很多其他问题,以至于switch语句的复杂性将是您最后关心的问题,即使不是O(1)