Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] максимально оптимальное кол. case в switch, не теряя производительности 
V
    Опции темы
rudvil
Дата 22.3.2011, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Телепортируюсь из темы Генерация статического кода из ДКА, switch или goto, что лучше?, сюда.
Мною было решено для генерации статического кода из ДКА использовать switch.
Т.е. например имея след. ДКА user posted image будет сгенерирован примерно след. код
Код
  int state = 1;
  switch(state) {
  case 1:
  {
    if(/*some condition*/) {
      state = 2;
    } else {
      state = 3;
    }
  }
  break;
  case 2:
  {
    /* do something */
    state = 5;
  }
  break;
  case 3:
  {
    /* do something */
    state = 5;
  }
  break;
  case 5:
  {
    /* accepting state */
    state = 0;
  }
  break;
  }

Как узнать, какое максимальное количество case'ов можно использовать в switch'е при этом не теряя эффективности switch'a/производительности?
--------------------
xor
PM MAIL Skype   Вверх
alexvs11
Дата 22.3.2011, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



попробовать сравнить?
на самом деле насколько мне представляется switch это замаскированное использование goto, ибо правила игры те же
PM MAIL   Вверх
mes
Дата 22.3.2011, 00:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



если индексы близки к линейному расположению, то компилятор заменит свитч на таблицу переходов.. 
в любом случае не стоит лишать компилятора удовольствия, оптимизировать подобные вещи, тем более, что он не плохо с этим справляется smile


--------------------
PM MAIL WWW   Вверх
rudvil
Дата 22.3.2011, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Цитата(alexvs11)
попробовать сравнить?
Вот только как?
Цитата(mes)
если индексы близки к линейному расположению, то компилятор заменит свитч на таблицу переходов.. 
в любом случае не стоит лишать компилятора удовольствия, оптимизировать подобные вещи, тем более, что он не плохо с этим справляется smile 
индексы могут идти не по порядку, а полностью вразброс.
И все-же как бы компилятор не оптимизировал, наверняка есть предел оптимального количества case'ов.
Представим наихудший вариант, все индексы нелинейны и расположение case'ов хаотично... какой в данном случае будет примерный лимит кол. case'ов с которым производительность не будет падать? спасибо.

Это сообщение отредактировал(а) rudvil - 22.3.2011, 00:47
--------------------
xor
PM MAIL Skype   Вверх
volatile
Дата 22.3.2011, 00:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(rudvil @  22.3.2011,  00:27 Найти цитируемый пост)
Как узнать, какое максимальное количество case'ов можно использовать в switch'е 

Вопрос не совсем корректен. Зависит от реализации компилятора.
Но, чисто по опыту могу сказать, что большие свитчи (по крайней мере на MSVS) довольно быстры smile

PM MAIL   Вверх
rudvil
Дата 22.3.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Цитата(volatile @ 22.3.2011,  00:53)
Цитата(rudvil @  22.3.2011,  00:27 Найти цитируемый пост)
Как узнать, какое максимальное количество case'ов можно использовать в switch'е 

Вопрос не совсем корректен. Зависит от реализации компилятора.
Но, чисто по опыту могу сказать, что большие свитчи (по крайней мере на MSVS) довольно быстры smile

gcc и msvc, остальное не интересует.
Вопрос не о совсем-совсем макс. кол. case'ов в switch'е, это можно в документации найти, а о максимально оптимальном кол. при котором не будет падения производительности.

Добавлено @ 01:01
Цитирую neutrino, из Генерация статического кода из ДКА, switch или goto, что лучше?
Цитата(neutrino)
Switch плох тем, что branch prediction процессора будет почти всегда miss-ить тем самым снижая производительность.
 собственно поэтому и решил создать тему, актуально ли это?

Это сообщение отредактировал(а) rudvil - 22.3.2011, 01:03
--------------------
xor
PM MAIL Skype   Вверх
volatile
Дата 22.3.2011, 01:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



rudvil, еще раз. Свитчи это не та причина от которой может серьезно упать производительность. Можете не бояться. (в разумных пределах конечно  smile )
PM MAIL   Вверх
rudvil
Дата 22.3.2011, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



Цитата(volatile @ 22.3.2011,  01:08)
rudvil, еще раз. Свитчи это не та причина от которой может серьезно упать производительность. Можете не бояться. (в разумных пределах конечно  smile )

Надеюсь что это так, утешили - спасибо.  smile 
--------------------
xor
PM MAIL Skype   Вверх
volatile
Дата 22.3.2011, 01:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(rudvil @  22.3.2011,  01:14 Найти цитируемый пост)
Надеюсь что это так, утешили - спасибо. 

Ну уж в любом случае быстрее кучи if'ов
PM MAIL   Вверх
borisbn
Дата 22.3.2011, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Здесь похожая тема поднималась
forum.vingrad.ru/forum/topic-296638/view-all/hl/switch/index.html


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 22.3.2011, 10:47 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



rudvil, в двух словах:
1. свитчи для последовательного набора вариантов (или очень близкого к нему) будут преобразованы в таблицу, что в итоге приведет к константному времени перехода к нужной ветке.
2. свитчи для случайного набора вариантов (которые совсем не похожи на линейную последовательность) будут преобразованы в бинарный поиск (поиск делением пополам), таким образом, время перехода к нужному элементу будет логарифмически (по основанию 2) зависеть от количества элементов (например, если элементов будет 256, то в худшем случае поиск займет 8 итераций).
3. если свитч маленький, и варианты 1 и 2 не подходят, то используется банальные if/else.

Это сообщение отредактировал(а) bsa - 22.3.2011, 10:52
PM   Вверх
kemiisto
Дата 22.3.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Цитата(volatile @  21.3.2011,  23:39 Найти цитируемый пост)
Ну уж в любом случае быстрее кучи if'ов 

Чем же? По крайней мере, ЦД обычно реализуют таки через loop (бесконечный цикл) и if - elseif - else.

Это сообщение отредактировал(а) kemiisto - 22.3.2011, 11:05


--------------------
PM MAIL WWW GTalk Jabber   Вверх
borisbn
Дата 22.3.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(kemiisto @  22.3.2011,  11:05 Найти цитируемый пост)
По крайней мере, ЦД обычно реализуют таки через loop (бесконечный цикл) и if - elseif - else.

Если в цикле Дейкстры условия разнозначные (if str="abc", if a==b, if x<y), то по другому и не сделаешь, а если сравнение целочисленного типа с константами (например с enum'ом), и их не два-три, то лучше использовать switch.
Нет ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 22.3.2011, 23:42 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(kemiisto @ 22.3.2011,  11:05)
Цитата(volatile @  21.3.2011,  23:39 Найти цитируемый пост)
Ну уж в любом случае быстрее кучи if'ов 

Чем же? По крайней мере, ЦД обычно реализуют таки через loop (бесконечный цикл) и if - elseif - else.

kemiisto, ответ на ваш вопрос содержится прямо над ним
Цитата(bsa @  22.3.2011,  10:47 Найти цитируемый пост)
свитчи для случайного набора вариантов .. будут преобразованы в бинарный поиск 

Иными словами, если допустим есть 128 кейсов, то для выбора подходящего нужно будет сделать 7 сравнений.
Если же это писать в if'aх, то в среднем нужно будет 64 ифа. И чем больше кейсов, тем ощутемее разници.
log2(N) против (N)

А если числа идут подряд (или с равными промежутками), то вообще строится таблица: (1) против (N)

Cамо-собой это при идеальном оптимизаторе. В реале конечно не так красиво, но создатели компиляторов к этому стремятся smile 

PM MAIL   Вверх
mes
Дата 23.3.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(volatile @  22.3.2011,  22:42 Найти цитируемый пост)
Если же это писать в if'aх, то в среднем нужно будет 64 ифа

точнее, то программисту надо будет попотеть, чтоб сьоптимизировать также , как это сделает оптимизатор не напрягаясь smile

Добавлено через 1 минуту и 7 секунд
Цитата(volatile @  22.3.2011,  22:42 Найти цитируемый пост)
Cамо-собой это при идеальном оптимизаторе

ну про идеальный сильно загнуто..  такого в природе не существует.. 



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1109 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.