Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/125: Рейтинг темы: голосов - 125, средняя оценка - 4.73
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126

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

07.07.2014, 10:22. Показов 24023. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.07.2014, 10:22
Ответы с готовыми решениями:

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

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

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

27
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
07.07.2014, 19:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Компилятор GNU GCC C++ .
попробуй с -O0, -O1, -O2, -O3 и кейсов хотя бы штук 10 - 15. Разница будет.
0
 Аватар для RaiaNKnight
97 / 71 / 12
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
07.07.2014, 19:15
Это понятно, на примере, который был дан выше разницы никакой.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
07.07.2014, 19:20
лень придумывать примеры
вот кусок дезасемблированой реальной программы

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
 cmp     ecx, 7                          ; switch 8 cases
ja      short loc_20495F                ; default
jmp     ds:off_204970[ecx*4]    
...................
 
off_204970 dd offset loc_2048F5  
                dd offset loc_2048F8 
                dd offset loc_204911
                dd offset loc_204916
                dd offset loc_20491B
                dd offset loc_20491B
                dd offset loc_2048FB
                dd offset loc_20490C
один из вариантов работы свитча
кучей сравнений и не пахнет

Добавлено через 2 минуты
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
который был дан выше разницы никакой.
еще раз повторю? разница огромная
в первом случае при a=2 отработают два if
так что пример ТС некорректен для исследования
1
 Аватар для RaiaNKnight
97 / 71 / 12
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
07.07.2014, 19:25
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Особо разницы не заметите, разве что во 1-м случае используются прыжки je, а во 2-м - jne.
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Это понятно, на примере, который был дан выше разницы никакой.

Не по теме:

Можно смотреть только листинг на asm, остальное некорректно

0
07.07.2014, 19:29

Не по теме:

Цитата Сообщение от Renji Посмотреть сообщение
Если внутре у ней неонка
тоже люблю "Сказку о тройке":) :handshake:

0
 Аватар для Martein
704 / 109 / 21
Регистрация: 22.06.2014
Сообщений: 241
07.07.2014, 19:43
Вот так выглядит код в дизассемблере для первого случая:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
0x401600                    push   ebp
0x401601  <+0x0001>         mov    ebp,esp
0x401603  <+0x0003>         and    esp,0xfffffff0
0x401606  <+0x0006>         sub    esp,0x10
0x401609  <+0x0009>         call   0x4020d0 <__main>
        8       int a;
        9       if(a == 2)
0x40160e  <+0x000e>         cmp    DWORD PTR [esp+0xc],0x2
0x401613  <+0x0013>         jne    0x40161a <main()+26>
        10      a += 2;
0x401615  <+0x0015>         add    DWORD PTR [esp+0xc],0x2
        11      if(a == 3)
0x40161a  <+0x001a>         cmp    DWORD PTR [esp+0xc],0x3
0x40161f  <+0x001f>         jne    0x401626 <main()+38>
        12      a+= 3;
0x401621  <+0x0021>         add    DWORD PTR [esp+0xc],0x3
        13      if(a == 4)
0x401626  <+0x0026>         cmp    DWORD PTR [esp+0xc],0x4
0x40162b  <+0x002b>         jne    0x401632 <main()+50>
        14      a+=4;
0x40162d  <+0x002d>         add    DWORD PTR [esp+0xc],0x4
        15  }
0x401632  <+0x0032>         mov    eax,0x0
0x401637  <+0x0037>         leave
0x401638  <+0x0038>         ret
И вот так он выглядит для второго случая:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
0x401600                    push   ebp
0x401601  <+0x0001>         mov    ebp,esp
0x401603  <+0x0003>         and    esp,0xfffffff0
0x401606  <+0x0006>         sub    esp,0x10
0x401609  <+0x0009>         call   0x4020d0 <__main>
        8       int a;
        9       switch(a)
0x40160e  <+0x000e>         mov    eax,DWORD PTR [esp+0xc]
0x401612  <+0x0012>         cmp    eax,0x3
0x401615  <+0x0015>         je     0x401628 <main()+40>
0x401617  <+0x0017>         cmp    eax,0x4
0x40161a  <+0x001a>         je     0x40162f <main()+47>
0x40161c  <+0x001c>         cmp    eax,0x2
0x40161f  <+0x001f>         jne    0x401635 <main()+53>
        10      {
        11      case 2: a += 2; break;
0x401621  <+0x0021>         add    DWORD PTR [esp+0xc],0x2
0x401626  <+0x0026>         jmp    0x401635 <main()+53>
        12      case 3: a+= 3; break;
0x401628  <+0x0028>         add    DWORD PTR [esp+0xc],0x3
0x40162d  <+0x002d>         jmp    0x401635 <main()+53>
        13      case 4: a += 4; break;
0x40162f  <+0x002f>         add    DWORD PTR [esp+0xc],0x4
0x401634  <+0x0034>         nop
        14      }
        15  }
0x401635  <+0x0035>         mov    eax,0x0
0x40163a  <+0x003a>         leave
0x40163b  <+0x003b>         ret
Код генерируется практически такой же, но в другой последовательности и для switch создаются дополнительные безусловные инструкции передачи управления JMP, что увеличивает слегка размер машинного кода и лишние такты процессорного времени. В первом случае вы просто сэкономите ровнёхонько 3 байта кода.

Добавлено через 9 минут
P.S. С другой стороны в блоках if сравнение значений происходит с ячейкой памяти ОЗУ, а в switch'e сравнения значений происходят с регистром EAX, что по теории быстрее на несколько тактов.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
07.07.2014, 20:04
Цитата Сообщение от Martein Посмотреть сообщение
Вот так выглядит код в дизассемблере для первого случая:
для чистоты эксперимента указывается компилятор,режим компиляции и степень оптимизации
по приведенным листингам могу сделать вывод что оптимизация на минимуме или вообще отсутствует
ибо при зверской оптимизации компилятор выбросил бы всю эту лабуду бессмысленную(результаты никуда не идут и нигде не используются ) и оставил бы что то типа
C++
1
2
3
4
int main()
{
return 0:
}


Добавлено через 1 минуту
Цитата Сообщение от Martein Посмотреть сообщение
push * ebp
0x401601 *<+0x0001> * * * * mov * *ebp,esp
0x401603 *<+0x0003> * * * * and * *esp,0xfffffff0
0x401606 *<+0x0006> * * * * sub * *esp,0x10
а это вообще говорит о компиляции в режиме debug
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
07.07.2014, 20:28
и для switch создаются дополнительные безусловные инструкции передачи управления JMP, что увеличивает слегка размер машинного кода и лишние такты процессорного времени.
С чего бы лишние такты будут? Во-первых, последовательный код будет распихан на несколько работающих параллельно конвейеров. Пока mov может выполняться на конвейере А, ему как-то пофиг что творится на конвейере Б. Хоть десяток jmp. Во-вторых, команды скорее всего будут перетасованы как удобно процессору, а не как написал программист (внеочередное исполнение). А если процессор напорется на переход, он включит Вангу и скажет "за jmp прозреваю я mov!" (предсказание переходов). И продолжит исполнять команды не по порядку. После всех этих шаманств jmp едва ли хоть кого-то замедлит.

Другое дело что на je встроенный в процессор хрустальный шар часто ошибается с предсказанием направления перехода и половина выполненных не по порядку вычислений идет в помойку. Поэтому je действительно может знатно подгадить производительности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2014, 20:28
Помогаю со студенческими работами здесь

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

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

if или switch? что быстрее
Здравствуйте. Подскажите пожалуйста,что быстрее будет выполняться много условий if ,или switch int z = 5; if (z==4) z= 3; if...

Что быстрее switch(enum) или if else?
Может кто нибудь знает,какая конструкция лучше в плане производительности: 1) enum e{one, two, three}; switch (e) { case.. ...

Что быстрее, вложенные REPLACE или функция с CASE на va?
Здравствуйте форумчане. Имеется база с приличным количеством записей, порядка миллиона. Задача в запросе вывести значение одного из полей...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru