С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

07.07.2014, 10:22. Просмотров 2534. Ответов 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;
}
Эти коды одинаковы по своим функциям, но какой же из них будет работать быстрее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 (согласно стандарта кажись неопределён, но все компиляторы я уверен в этом...

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

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

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

Ну и каждое ветвление награждает вас 50% бонусом к шансу получить неверным предсказанием перехода по башке. Что не лучшим образом сказывается на производительности. Поэтому лучше их без нужды не плодить.
2
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 10:41 #6
Цитата Сообщение от IrineK Посмотреть сообщение
При а = 3 отработают два первых case.
это почему?
1
IrineK
Заблокирован
07.07.2014, 10:45 #7
Цитата Сообщение от Kukurudza Посмотреть сообщение
это почему?
Цитата Сообщение от Kukurudza Посмотреть сообщение
свитч вроде в в ифы разворачивается
И else.
2
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 10:47 #8
А, чьёрт действительно.
1
zss
Модератор
Эксперт С++
6587 / 6149 / 2025
Регистрация: 18.12.2011
Сообщений: 16,034
Завершенные тесты: 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 строку пришлось продублировать
0
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 11:21 #10
кейсы без брейков жесть какая-та имхо
0
zss
Модератор
Эксперт С++
6587 / 6149 / 2025
Регистрация: 18.12.2011
Сообщений: 16,034
Завершенные тесты: 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++;
}
1
palva
2696 / 1923 / 288
Регистрация: 08.06.2007
Сообщений: 7,082
Записей в блоге: 4
07.07.2014, 11:52 #12
Все промышленные компиляторы имеют мощный оптимизатор, который нивелирует любые ухищрения программиста сделать код эффективнее. Реально влиять на эффективность можно, если вы пишете на ассемблере. А на языке высокого уровня лучше обращать внимание на прозрачность кода, на соответствие его корпоративным стандартам и на облегчение сопровождения. Об эффективности нужно думать на этапе архитектурного проектирования. А когда дело дошло до языка си, то простое наличие комментариев важнее эффективности.
1
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
07.07.2014, 11:54 #13
Цитата Сообщение от palva Посмотреть сообщение
который нивелирует любые ухищрения программиста сделать код эффективнее.
из практики например развертка циклов (два вложенных друг в друга) дала ощутимый результат. переводил из RGB в YUV.
1
Airracer92
0 / 0 / 0
Регистрация: 02.07.2014
Сообщений: 6
07.07.2014, 15:34 #14
в данном случае разницы никакой для человеческого восприятия скорости, однако теоретически кейс быстрее
0
korvin_
1940 / 1425 / 226
Регистрация: 28.04.2012
Сообщений: 5,098
07.07.2014, 17:49 #15
Цитата Сообщение от zss Посмотреть сообщение
Иногда очень даже удобно. Только настоятельно рекомендуется это место комментировать:
Вот из-за этих "иногда" и "настоятельно рекомендуется это место комментировать" лучше бы был неявный break и явный fallthroug.
0
07.07.2014, 17:49
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++
Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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