Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
#1

If или switch().case. Что быстрее - C++

07.07.2014, 10:22. Просмотров 2234. Ответов 27
Метки нет (Все метки)

Есть два кода. Первый:
C++
1
2
3
4
5
6
if(a == 2)
a += 2;
if(a == 3)
a+= 3;
if(a == 4)
a+=4;
Второй:
C++
1
2
3
4
5
6
switch(a)
}
case 2: a += 2; break;
case 3: a+= 3; break;
case 4: a += 4; break;
}
Эти коды одинаковы по своим функциям, но какой же из них будет работать быстрее?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2014, 10:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос If или switch().case. Что быстрее (C++):

switch case 1 ИЛИ 2 - C++
делаю разбор вводимых команд, некоторые обрабатываются похоже, команды однобуквенные, разбираю кейсом, но вот как сделать чтобы 1 блок...

case outside of switch ? Что за ошибка? - C++
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #pragma argsused ...

Что делают операторы switch/case - C++
что делают функции : switch ? case ?

Оптимальная конструкция switch-case-while / while-switch-case - C++
Имеется конструкция типа: switch() { case 1: while() { ... }

Статический хеш или switch-case/if-else для выбора - C++
Добрый день. Положим есть такой код:void parseByType(const QString &data, const QString &type) { if(type == "integer") { ...

Оптимизируется ли компилятором конструкция switch-case? Работа со строками через ID объекта или hash - C++
Добрый вечер, 1) Определён ли порядок выбора switch (согласно стандарта кажись неопределён, но все компиляторы я уверен в этом...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6367 / 5931 / 1923
Регистрация: 18.12.2011
Сообщений: 15,240
Завершенные тесты: 1
07.07.2014, 10:24 #2
Скорее всего, разницы в скорости Вы не заметите.
Однако, второй код более нагляден.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 10:36 #3
Цитата Сообщение от mihalech19 Посмотреть сообщение
Эти коды одинаковы по своим функциям
нет
Цитата Сообщение от mihalech19 Посмотреть сообщение
но какой же из них будет работать быстрее
свитч вроде в в ифы разворачивается, нэ?
IrineK
Заблокирован
07.07.2014, 10:37 #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В первом случае все if будут проверяться всегда.

Во втором случае все case будут пройдены только при а = 4. Например, если а = 2, то отработает только первый case и мы выйдем по break. При а = 3 отработают два первых case.

В среднем - второй случай быстрей.
Renji
1912 / 1310 / 295
Регистрация: 05.06.2014
Сообщений: 3,745
07.07.2014, 10:37 #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Эти коды одинаковы по своим функциям, но какой же из них будет работать быстрее?
if выполняет столько сравнений, сколько у вас вариантов. switch вероятнее всего сделает двоичный поиск и выполнит число сравнений равное двоичному логарифму от числа вариантов. Если внутре у ней неонка jmp по табличке, то и вовсе в одну команду уложится.

Ну и каждое ветвление награждает вас 50% бонусом к шансу получить неверным предсказанием перехода по башке. Что не лучшим образом сказывается на производительности. Поэтому лучше их без нужды не плодить.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 10:41 #6
Цитата Сообщение от IrineK Посмотреть сообщение
При а = 3 отработают два первых case.
это почему?
IrineK
Заблокирован
07.07.2014, 10:45 #7
Цитата Сообщение от Kukurudza Посмотреть сообщение
это почему?
Цитата Сообщение от Kukurudza Посмотреть сообщение
свитч вроде в в ифы разворачивается
И else.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 10:47 #8
А, чьёрт действительно.
zss
Модератор
Эксперт С++
6367 / 5931 / 1923
Регистрация: 18.12.2011
Сообщений: 15,240
Завершенные тесты: 1
07.07.2014, 11:18 #9
Кстати, не так-то просто иногда развернуть в if, например:
C++
1
2
3
4
5
6
7
8
9
int a=0;
int m;cin>>m;
switch(m)
{
case 1:
    a=2;
case 2:
    a++;
}
C++
1
2
3
4
5
6
if(m==1)
{      
     a=2;
     a++;
}else if(m==2)
     a++;
8 строку пришлось продублировать
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 11:21 #10
кейсы без брейков жесть какая-та имхо
zss
Модератор
Эксперт С++
6367 / 5931 / 1923
Регистрация: 18.12.2011
Сообщений: 15,240
Завершенные тесты: 1
07.07.2014, 11:34 #11
Цитата Сообщение от Kukurudza Посмотреть сообщение
жесть какая-та
Иногда очень даже удобно. Только настоятельно рекомендуется это место комментировать:
C++
1
2
3
4
5
6
7
8
switch(m)
{
case 1:
    a=2;
// брейк не нужен (проваливаемся дальше)
case 2:
    a++;
}
palva
2611 / 1833 / 262
Регистрация: 08.06.2007
Сообщений: 6,990
Записей в блоге: 4
07.07.2014, 11:52 #12
Все промышленные компиляторы имеют мощный оптимизатор, который нивелирует любые ухищрения программиста сделать код эффективнее. Реально влиять на эффективность можно, если вы пишете на ассемблере. А на языке высокого уровня лучше обращать внимание на прозрачность кода, на соответствие его корпоративным стандартам и на облегчение сопровождения. Об эффективности нужно думать на этапе архитектурного проектирования. А когда дело дошло до языка си, то простое наличие комментариев важнее эффективности.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 11:54 #13
Цитата Сообщение от palva Посмотреть сообщение
который нивелирует любые ухищрения программиста сделать код эффективнее.
из практики например развертка циклов (два вложенных друг в друга) дала ощутимый результат. переводил из RGB в YUV.
Airracer92
0 / 0 / 0
Регистрация: 02.07.2014
Сообщений: 6
07.07.2014, 15:34 #14
в данном случае разницы никакой для человеческого восприятия скорости, однако теоретически кейс быстрее
korvin_
1802 / 1270 / 196
Регистрация: 28.04.2012
Сообщений: 4,609
07.07.2014, 17:49 #15
Цитата Сообщение от zss Посмотреть сообщение
Иногда очень даже удобно. Только настоятельно рекомендуется это место комментировать:
Вот из-за этих "иногда" и "настоятельно рекомендуется это место комментировать" лучше бы был неявный break и явный fallthroug.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2014, 17:49
Привет! Вот еще темы с ответами:

Может ли значение метки case в операторе switch быть числовым отрезком, или только константой? - C++
Например, в Pascal возможна запись: ... Case a of 0..15: Write( a+7 ); ... Возможно ли аналогичная запись в c++? или...

Switch case внутри switch case - C++
Привет всем! Нужна помощь. Пишу калькулятор с консольным меню. Так вот, используется цикл while, внутри которого у меня switch...

switch-case, как писать в самом case - C++
Такс дело вот в чём,прога работает всё хорошо,вот только мне не нравится как записваю страны в кейсе,можно ли каким-нибудь образом писать в...

Что быстрее: i++ или ++i ? - C++
Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.07.2014, 17:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru