![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| rudvil |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 2 Всего: 3 |
Телепортируюсь из темы Генерация статического кода из ДКА, switch или goto, что лучше?, сюда.
Мною было решено для генерации статического кода из ДКА использовать switch. Т.е. например имея след. ДКА будет сгенерирован примерно след. код
Как узнать, какое максимальное количество case'ов можно использовать в switch'е при этом не теряя эффективности switch'a/производительности? --------------------
xor |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
попробовать сравнить?
на самом деле насколько мне представляется switch это замаскированное использование goto, ибо правила игры те же |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если индексы близки к линейному расположению, то компилятор заменит свитч на таблицу переходов..
в любом случае не стоит лишать компилятора удовольствия, оптимизировать подобные вещи, тем более, что он не плохо с этим справляется |
|||
|
||||
| rudvil |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 2 Всего: 3 |
И все-же как бы компилятор не оптимизировал, наверняка есть предел оптимального количества case'ов. Представим наихудший вариант, все индексы нелинейны и расположение case'ов хаотично... какой в данном случае будет примерный лимит кол. case'ов с которым производительность не будет падать? спасибо. Это сообщение отредактировал(а) rudvil - 22.3.2011, 00:47 --------------------
xor |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| rudvil |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 2 Всего: 3 |
gcc и msvc, остальное не интересует. Вопрос не о совсем-совсем макс. кол. case'ов в switch'е, это можно в документации найти, а о максимально оптимальном кол. при котором не будет падения производительности. Добавлено @ 01:01 Цитирую neutrino, из Генерация статического кода из ДКА, switch или goto, что лучше?
Это сообщение отредактировал(а) rudvil - 22.3.2011, 01:03 --------------------
xor |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
rudvil, еще раз. Свитчи это не та причина от которой может серьезно упать производительность. Можете не бояться. (в разумных пределах конечно
|
|||
|
||||
| rudvil |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 2 Всего: 3 |
Надеюсь что это так, утешили - спасибо. --------------------
xor |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Здесь похожая тема поднималась
forum.vingrad.ru/forum/topic-296638/view-all/hl/switch/index.html -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
rudvil, в двух словах:
1. свитчи для последовательного набора вариантов (или очень близкого к нему) будут преобразованы в таблицу, что в итоге приведет к константному времени перехода к нужной ветке. 2. свитчи для случайного набора вариантов (которые совсем не похожи на линейную последовательность) будут преобразованы в бинарный поиск (поиск делением пополам), таким образом, время перехода к нужному элементу будет логарифмически (по основанию 2) зависеть от количества элементов (например, если элементов будет 256, то в худшем случае поиск займет 8 итераций). 3. если свитч маленький, и варианты 1 и 2 не подходят, то используется банальные if/else. Это сообщение отредактировал(а) bsa - 22.3.2011, 10:52 |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Чем же? По крайней мере, ЦД обычно реализуют таки через loop (бесконечный цикл) и if - elseif - else. Это сообщение отредактировал(а) kemiisto - 22.3.2011, 11:05 -------------------- |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Если в цикле Дейкстры условия разнозначные (if str="abc", if a==b, if x<y), то по другому и не сделаешь, а если сравнение целочисленного типа с константами (например с enum'ом), и их не два-три, то лучше использовать switch. Нет ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| volatile |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
kemiisto, ответ на ваш вопрос содержится прямо над ним
Иными словами, если допустим есть 128 кейсов, то для выбора подходящего нужно будет сделать 7 сравнений. Если же это писать в if'aх, то в среднем нужно будет 64 ифа. И чем больше кейсов, тем ощутемее разници. log2(N) против (N) А если числа идут подряд (или с равными промежутками), то вообще строится таблица: (1) против (N) Cамо-собой это при идеальном оптимизаторе. В реале конечно не так красиво, но создатели компиляторов к этому стремятся |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
точнее, то программисту надо будет попотеть, чтоб сьоптимизировать также , как это сделает оптимизатор не напрягаясь Добавлено через 1 минуту и 7 секунд ну про идеальный сильно загнуто.. такого в природе не существует.. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |