![]() |
|
Модераторы: 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 секунд ну про идеальный сильно загнуто.. такого в природе не существует.. |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Во-первых, зависит от реализации. Значит в общем случае неверно.
Во-вторых, я в упор не вижу пруфов с исходниками GCC, например, с этими вашими таблицами переходов. Вы проверяли? Или так. Кто-то где-то написал... Болтовню вижу, пруфо - нет. В-третьих, бенчмарков я тоже не увидел. Для закрытых реализаций полагаться больше не на что. В-четвёртых, я не понял насчёт 64 if'ов. Да, я в курсе, что С++ - язык калека и что даже "честного" многоветочного if там нет. Но неужели ваш хвалёный оптимизатор неспособен распознать такую ситуацию? Вы уверены? Исходники смотрели? Тесты? Пока пруфы не запилите, я буду считать вас пустословами. -------------------- |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
Ну просто Первое, что попалось на глаза Уже даже при 5 кейсах свитч обгоняет ифы. Впрочем, дальше искать не стал, так как я ничего никому доказывать не собираюсь. Если вам действительно интересно, все сможете найти. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если вкусы не изменились, то Оберон. |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Почитания - никакой. Ты мало бываешь в Интернетах. Эти слова уже лет 20 как повсюду. 1) Это результаты на конкретной реализации. Не указано какой. 2) Нет ключей компилятора (настроек проекта). 3) Of course, this wouldn’t even be noticeable in most applications. 4) [...] timings may vary quite a bit [...]
Запомни, как писать эту фразу правильно в Интернетах: "Я сливаю базар." -------------------- |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
||||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
http://forum.vingrad.ru/index.php?showtopi...t&p=2130619 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
borisbn, ну вот уже что-то. Хорошо, показана эта самая таблица смещений, или как вы её там называете. Теперь надобно на рельном (из практики) конечном автомате показать, что будет:
volatile, заметь, ты сейчас отвечал не мне. Т.к.
-------------------- |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
я ничего не путаю, вопрос тс ведь был :
т.е. вопрос не о выйгрыше,а об отсутствии проигрыша.. |
||||
|
|||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Путаешь. -------------------- |
|||
|
||||
| rudvil |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 20.11.2009 Где: Latvia/Riga Репутация: 2 Всего: 3 |
Но т.к.
Не заморачиваться же с goto Это сообщение отредактировал(а) rudvil - 23.3.2011, 12:49 --------------------
xor |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
причем тут goto? все операторы ветвлений (условий и циклов) реализуются через (условные) переходы. Поэтому самостоятельно связываться с goto смысла в 99,99% случаев нет никакого. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
мне показалось, что имелись ввиду не оптимизированные условия.. т.е. что свитч сделает не медленее, но вероятно и быстрей.. подразумевается случай если программист не будет тратить свое время на "вылизывание" ифов для конкретной узкой задачи под конкретную платформу.. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |