MyTetra Share
Делитесь знаниями!
switch vs if/else
Время создания: 03.06.2021 15:27
Раздел: Computer - Programming - C
Запись: silenn/mind/master/base/1622723276skhmzgmtix/text.html на raw.githubusercontent.com

Качественный switch выполняется очень быстро, потому как на ассемблере преобразуется в табличный переход. В этом случае не выполняются множественные проверки на совпадение до упора - само выражение используется для чтения адреса в таблице адресов для прямого перехода на готовый код.

Для того, чтобы switch получился качественным, выражение для проверки должно быть линейным, и не содержать пробелов.

Идеально: 0,1,2,3,4,5,6....

Допустимо: 101,102,103,104,105,106...

Ну или: -50,-49,48,47,46...

Допустимо только с оптимизацией выше -О0: 0,5,1,3,2,4.. - тут нет пробелов.


Умная железяка сама отсортирует линии переходов. Вариант: -50,0,10,50,101... - будет работать медленнее в десятки - сотни раз. Это для любителей засовывать в switch необработанные флаги ошибок регистров.

Кстати, для switch ARM - это одна компактная команда TB(B-H), для x86 - это уже сборная команда.


Уровень оптимизации точно указывает стратегию сборки кода. Например, при нулевом уровне табличный код будет использоваться только в случае явного линейного диапазона от нуля, без пробелов.

При -O1 допустимо смещение линейного участка, и количество пробелов меньше 1/10 от используемого диапазона.

При -O2, -О3 - смещение, и количество пробелов 2/10 и 4/10.

А при -Os - в случае пробелов будет несколько таблиц, отчего код на асме превращается лабиринт.









 
MyTetra Share v.0.55
Яндекс индекс цитирования