![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Всем доброго времени суток! Итак... вчера я сидел и думал... какой же оператор будет работать быстрее? Да я понимаю что это практически ... ну минимальная оптимизация. Но всё же! Давайте подумаем как работает switch. Он проверяет переменную на равенство числу и если они равны делает блок операторов... так вот. Он же проверяет! Он же не угадывает и т.д. а значит по логике он работает по принципу if . Делая с этого вывод можно сказать что:
1) Оператор switch построен на основе if 2) Оператор if будет быстрее 3) Просто оператор switch в некоторых случаях более удобный. Я прав? |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 3 Всего: 317 |
если критерий - время работы, то для идентичного функционала -
и if, и switch будут в результате компиляции приведены к единому варианту. if - это не оператор, как и switch. это т.н. утверждения, состоящие из ключевыз слов и "выражений". т.е. само по себе if - бессмысленное ключевое слово, а не оператор. в контексте Си, 'оператор' "при включении" имеет значение. if или switch не имеют. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| Kirgston |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 792 Регистрация: 24.12.2007 Репутация: нет Всего: 2 |
Ах да... я забыл... начал думать в логику С++ ))) и забыл что в итоге это всё итак асм код =)
Так что ... хе хе =) пардон просто не учёл. |
|||
|
||||
| _Dimon_ |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 25.6.2007 Где: Украина Репутация: нет Всего: 1 |
хотя в итоге может одно и тоже, но конечно switch намного удобней чем множественные ифы, и я думаю с этим никто не будет спорить
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
в принципе, у компилятора больше свободы для оптимизации switchиз-за накладываемых ограничений
например, switch на 100 вариантов можно попробовать привести к бинарному поиску, т.к. используютсятолько интегральные константы, т.е. их можно сравнивать, и они известны на этапе компиляции Добавлено через 47 секунд возможно, конечно, компилятор распознает и эквивалентную последовательность if-ов, еслиона соответствует ограничениям, но это, по-моему, очень маловероятно -------------------- qqq |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
нужно писать код исходя из того, что его будут читать другие люди, т.е. код должен быть читаемым, а не "быстрым", многоэтажные switch-и и if-ы лучше стараться избегать, если в программе появляется необходимость написать switch, на 30 вариантов, то это признак неправильного проектирования приложения(невсегда конечно, но часто), к примеру, с помощью switch иногда пытаются реализовать полиморфизм, хотя для этого лучше использовать виртуальные ф-ии...
|
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
if - последовательное сравнение или бинарный поиск
switch - таблицы или бинарный поиск в ряде случаев switch и if компилируются одинакого |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
switch (если его правильно написать) может работать быстрее благодаря таблице переходов. т.е. компилятор может его оптимизировать в таблицу переходов. Также посмотри Duffs Device который копирует массив с помощью switch -а. По ссылкам пройди, там хорошо описано
с подобным утверджением я бы поспорил..В большинстве случаев - да! но не во всех. Возможны ситуации когда вам нужна ооочень высокая производительность..и тогда вам хочешь не хочешь а придется повышать производительность за счет нечитабельного кода...комментарии то никто не отменял
с этим согласен Это сообщение отредактировал(а) azesmcar - 8.3.2009, 15:38 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вы забыли как минимум еще один пункт: 4) Кесарю кесарево. if и switch не взаимозаменяемы, у каждого из них своя область применения. Там где можно использовать switch, лучше использовать именно его. Помимо if и switch существует еще ?: Это сообщение отредактировал(а) mes - 8.3.2009, 16:15 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
да Kirgston тернарный оператор и if тоже немного различаются..?: может работать compile-time, if - нет, благодаря чему тернарный оператор успешно используется в метапрограммировании. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
прежде чем написать нечитаемый но быстрый код, нужно написать читаемый, но медленный, выяснить почему он медленный и исправить это по твоему
|
|||
|
||||
| inside_pointer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
в switch тяжело выходить из цикла и они совсем по-разному условия проверяют (множественные if'ы проверяют истинность условия, а switch проверяет совпадение)
|
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
не спорю
Зависит от того о чем мы говорим, если говорить о C++ то в принципе да, отключите оптимизацию и он ее выполнит.. Но если включить, оптимизатор наверняка вырежет эту проверку. Это сообщение отредактировал(а) azesmcar - 8.3.2009, 20:56 |
||||
|
|||||
| 0xDX |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.2.2009 Репутация: нет Всего: нет |
до 10 сравнений, не будет иметь значение с чем воспользоваться, а иначе уже можно начинать делать полиморфизм......... Или искать закономерность.
P.S полиморфизм - это не только виртуальные функции.... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
т.е если больше 10 то разница будет заметна ?! и на чьей стороне преимущество ?
Нельзя ли тут поподробнее ? как для динамического сравнения полиморфизм даст выгоду в скорости ? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |