Является ли производительность переключателя выше перечисленных случаев O (1) - PullRequest
1 голос
/ 05 июня 2019

Я не смог найти информацию о выполнении оператора switch во всех случаях перечисления.Скажем, у вас есть 100 случаев.Это O (1)?

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

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

1 Ответ

1 голос
/ 07 июня 2019

Глядя на код сборки («Отладка» »« Рабочий процесс отладки »» «Всегда показывать разборку») для оператора switch, можно увидеть, что это O (1) (по крайней мере, в этом простом случае, внаименее).Например, вот код switch:

enter image description here

Не заблудитесь в этом коде, но обратите внимание, что очень мало инструкций, которые устанавливаютсодержимое rdx должно быть адресом кода, связанного с этим конкретным case:

enter image description here

Подробности здесь не очень актуальны, но ключ в том, что в моем перечислении с 1000 делами оно не проходило 1000 проверок, а вычисляло адрес, вычисляя по индексу в этом перечислении, и просто переходило к соответствующему коду.


С учетом всего вышесказанного, перечисления обычно не имеют достаточно случаев, чтобы сложность оператора switch была когда-либо наблюдаемой.И если бы у вас были тысячи (или миллионы) различных случаев, с кодом было бы так много других проблем, что сложность оператора switch была бы последней из ваших проблем, даже если бы это не было O (1).

...