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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Переписать файл так, чтобы чередовались знаки компонент файла. http://www.cyberforum.ru/cpp-beginners/thread1223680.html
Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл F содержит столько же отрицательных чисел, сколько положительных. Используя вспомогательный файл H, переписать компоненты файла F в файл G так, чтобы в файле G не было двух соседних компонент с одним знаком.
C++ Странная перегрузка операторов (Error: ambiguous overload for 'operator[]') Что-то я туплю. Есть код: #include<string> struct test { int operator(const std::string&)const{return 0;} operator int()const{return 0;} }; int main() { test t; http://www.cyberforum.ru/cpp-beginners/thread1223655.html
C++ Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток
Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток. То, что я написал: #include <vector> #include <iostream> #include <iomanip> using namespace std;
Найти общую сумму стоимости всех перевозок и отдельно по каждому виду. C++
Помогите 2 задания зделать полчиса сижу никак зделать не могу тут легко я просто чтота вдуплить не могу 2. Общая сумма стоимости всех перевозок; 3. Сумма стоимости по каждому виду перевозок; #include <iostream> using namespace std; #pragma warning (disable: 4996) int sum;
C++ Как объявить массив структур? http://www.cyberforum.ru/cpp-beginners/thread1223596.html
Как задать массив в С++? Type gostinica= record FIO:string; nomer:integer; cena: integer; kolvo: integer; itogo:integer; end; Var
C++ Программа, во время выполнения, после ввода, прекращает работу Проблема такая: Предисловие... Недавно я уже обращался сюда на форум из-за того, что с функцией randomize программа не компилировалась. Я, при помощи тех, кто мне помог, определил, как нужно было решить проблему.Ну и, собственно, решил проблему. Переделал все как требуется. Сначала скомпилировал программу: все верно. Запустил: спрашивает "введите размер массива:", я ему ввожу "3" (ради... подробнее

Показать сообщение отдельно
Martein
Оператор ЭВМ 6 разряда
 Аватар для Martein
656 / 67 / 12
Регистрация: 22.06.2014
Сообщений: 145
07.07.2014, 19:43     If или switch().case. Что быстрее
Вот так выглядит код в дизассемблере для первого случая:
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, что по теории быстрее на несколько тактов.
 
Текущее время: 14:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru