11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134

if или switch? что быстрее

17.08.2011, 11:59. Показов 36418. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Подскажите пожалуйста,что быстрее будет выполняться много условий if ,или switch
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int z = 5;
 
if (z==4) z= 3;
if (z==3) z= 3;
if (z==5) z= 3;
 
или 
switch(z)
{
 
case 4: ...
 
....
case 5:.....
Подскажите книжку какую где можно прочитать про быстроту выполнения программного кода.
Заранее спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.08.2011, 11:59
Ответы с готовыми решениями:

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?
Всем привет! Господа, выручайте. Не пойму как еще оптимизировать... Есть куча связанных таблиц. Нужно выводить статистику используя...

Что быстрее - метод или свойство?
private static int ReadTime { get { var buffer = new byte; int...

Что быстрее умножение или деление?
Что быстрее выполнится: большое число*небольшое или 1/большое число? Большие числа приблизительно одинаковы Небольшое - число от 5 до...

27
Мохаммед Али
 Аватар для asd321
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
17.08.2011, 12:09
Цитата Сообщение от franken Посмотреть сообщение
что быстрее будет выполняться много условий if ,или switch
свичч
1
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
17.08.2011, 12:33  [ТС]
А про оптимизацию кода не подскажите книжечку?
0
 Аватар для Dejust
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
17.08.2011, 13:04
Не думаю, что замена конструкций языка даст хоть какую-то выгоду в производительности.. Смотри в сторону поиска наиболее эффективных алгоритмов (для конкретной задачи) и оптимизации найденых/разработанных (Подходящая книга - "Алгоритмы. Построение и анализ" Кормен)
1
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
17.08.2011, 21:06  [ТС]
спасибо
0
12 / 12 / 2
Регистрация: 04.08.2011
Сообщений: 57
17.08.2011, 22:51
Ну не знаю, если вместо этого:
C# Скопировано
1
2
3
if (z==4) z= 3; 
if (z==3) z= 3; 
if (z==5) z= 3;
написать вот это:
C# Скопировано
1
2
3
if (z==4) z= 3; 
else if (z==3) z= 3; 
else  z= 3;
выполнение if будет равноценно switch, если не быстрее. ИМХО. Зависит от случая.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
18.08.2011, 03:26
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от franken Посмотреть сообщение
Здравствуйте. Подскажите пожалуйста,что быстрее будет выполняться много условий if ,или switch
Конструкция if-elseif-else выполняет последовательный перебор. Комбинаторная сложность соответсвенно n.
Конструкция switch позволяет проводить бинарный поиск. Комбинаторная сложность - log2(n) + 1 + небольшие затраты на кэширование искомой величины.

Соответственно если вам нужно рассмотреть всего 2-3 варианта - то предпочтительнее использовать if.
А вот если более 4х - то switch будет работать быстрее.
5
774 / 554 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
18.08.2011, 23:29
Для того что бы реально убедиться кто быстрее предлагаю запустить следующие прогу сначала с switch , а потом с if . Путем исключения из программы участка кода с помощью комментариев .Где триста миллионов итераций с "switch" и "if"
Свойство Environment.TickCount засекает время до работы программы и после ,выводя разницу .Аналогично можно подсчитывает время выполнения любых операций

C# Скопировано
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
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication5
{
    class Program
    {
      public  static void Main(string[] args)
        {
            int result = Environment.TickCount;
            int a=0;
 //******************************************************************         
            for (int i = 0,Switch=3; i < 300000000  ; i++)
            {
             switch(Switch)
             { 
                 case 1: a=a+1    ;break;
                 case 2: a=a+1    ;break;
                 case 3: a=a+1    ;break;
 
             }
            }
 /******************************************************************
        for (int i = 0,If=3; i < 300000000  ; i++)
            {
             if(If==1) a=a+1;
             if(If==2) a=a+1;
             if(If==3) a=a+1;
            }                                                       
/******************************************************************/
            Console.WriteLine("completed for {0} ",Environment.TickCount-result);
            Console.ReadLine();
            //my result: switch - 1183 millisecon, if - 1735  millisecon
        }
     }
}
2
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
19.08.2011, 01:13
Vitall, не вариант ибо перебора не 300000000, а только 3. вот если бы вы написали 300000000 условий или столько же switch - тогда можно было бы проверять, а так надеяться на накопление какой-то погрешности не стоит, она может возникнуть сама собой
0
774 / 554 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
19.08.2011, 01:58
Увеличить кол-во условий кейсов до 9 .Что уже выдает неоспоримое преимущество switch c результатом : switch - 1172 milliseconds, if - 4171 milliseconds .К тому же если погрешности на стороне switch это уже аргумент .В такой ситуации у if есть небольшое преимущество использования continue после успешного срабатывания if что избавляет от необходимости проверять условия дальше , хотя даже если If=1; if (If == 1) {a = a + 1; continue;}их результаты примерно одинаковы .
C# Скопировано
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication5
{
    class Program
    {
      public  static void Main(string[] args)
        {
            int result = Environment.TickCount;
            int a=0;
 //******************************************************************         
            for (int i = 0,Switch=9; i < 300000000  ; i++)
            {
             switch(Switch)
             { 
                 case 1: a=a+1    ;break;
                 case 2: a=a+1    ;break;
                 case 3: a=a+1    ;break;
                 case 4: a = a + 1; break;
                 case 5: a = a + 1; break;
                 case 6: a = a + 1; break;
                 case 7: a = a + 1; break;
                 case 8: a = a + 1; break;
                 case 9: a = a + 1; break;
 
             }
            }
/******************************************************************
                   for (int i = 0,If=9; i < 300000000  ; i++)
                       {
                        if (If == 1) {a = a + 1; continue;}
                        if(If==2) a=a+1;
                        if(If==3) a=a+1;
                        if(If==4) a=a+1;
                        if(If==5) a=a+1;
                        if(If==6) a=a+1;
                        if(If==7) a=a+1;
                        if(If==8) a=a+1;
                        if(If==9) a=a+1;
                       }                                                       
/******************************************************************/
            Console.WriteLine("completed for {0} ",Environment.TickCount-result);
            Console.ReadLine();
            //my result: switch - 1172 milliseconds, if - 4171  milliseconds
        }
     }
}
Мой вердикт - неоспоримый победитель switch
4
9 / 9 / 2
Регистрация: 05.08.2011
Сообщений: 18
19.08.2011, 03:22
Vitall, в коде со switch после первого выполнения условия, дальше не производится действий. При использовании if без else, каждый следующий if проверяется, т.е. этот код делает не одно и тоже. Но даже если вы напишите эквивалентный код, всегда будет существовать погрешность при сравнении скорости выполнения команд (из-за работы других программ, особенностей вызова той или иной функции и кучи других факторов, о которых даже не стоит задумываться). На mnds где-то писали, что подобные тесты никогда не дают верный результат. Плюс ко всему, когда if много, то с кучей else они выглядят менее компактно, чем switch, не говоря уже о том, что вы сами можете запутаться. В итоге применять их нужно, когда они более удобны и не забивать себе голову о том, кто из них быстрее. Dejust верно сказал, главное продумать алгоритм программы, это даст намного большую оптимизацию.
1
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
19.08.2011, 10:56  [ТС]
Спасибо! очень помогли,особенно Vitall.
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
19.08.2011, 21:44
В данном случае я бы сделал так:
C# Скопировано
1
2
3
4
5
public static int [] vectCase =    { 0,0,0,3,3,3};
 
int find( int z) {
    return  vectCase[z];
}
И ни какого линейного поиска.
0
мастер топоров
 Аватар для Koran
917 / 742 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
20.08.2011, 00:21
chessman1, только в случае INumerable
0
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
21.08.2011, 00:40
Цитата Сообщение от Koran Посмотреть сообщение
chessman1, только в случае INumerable
Дело как раз в конкретных случаях. Если есть необходимость в очень-очень быстром исполнении кода,
(например в логических играх с анализом дерева игры, которое растёт очень быстро), все стандартные
библиотеки ни куда не годятся - надо делать свои структуры и обработчики под них - только тогда
можно достичь приемлевого результата.
1
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,794
Записей в блоге: 4
11.09.2022, 01:54
Если верить этой инструкции https://docs.microsoft.com/en-... sm4---asm- то switch будет быстрее т.к. его назначение вызвать тот блок номер которого указан в switch, перебора не происходит. Оператор уже знает через сколько байт нужно перепрыгнуть чтобы вызывать нужный уровень, об этом написано по ссылке которую я дал. Но если условий очень мало например 2 или 4 то лучше использовать if, а если много и речь идёт о вызове уровня то switch будет быстрее. В инструкции указано что switch может использовать только целые числа.

Добавлено через 5 минут
Оператор switch уже на стадии компиляции знает где какой блок находится и в реалтайм вызовет нужный блок, конечно это медленнее чем массив но быстрее чем if.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
15958 / 11094 / 2864
Регистрация: 21.04.2018
Сообщений: 32,573
Записей в блоге: 2
11.09.2022, 02:36
Цитата Сообщение от franken Посмотреть сообщение
if или switch? что быстрее
Цитата Сообщение от chessman1 Посмотреть сообщение
Если есть необходимость в очень-очень быстром исполнении кода
При маленьком количестве условий вы вряд ли сможете получить между ними разницу существенную для ПРАКТИЧЕСКОГО приложения.
А большое количество условий вряд ли будете писать "ручками" в коде.

В тех случаях когда стоит задача ультра оптимизации какого-то алгоритма для конкретной платформы, то лучше не "последние капли" из Шарпа выжимать, а создать наитивную библиотеку на плюсах и использовать её методы.
Всё таки задача Шарпа это не соревнование в быстродействии, а попытка создания платформонезависимого кода исполняемого CLR. А универсальность уже требует каких-то жертв по оптимизации других параметров.
1
11.09.2022, 05:09

Не по теме:

Цитата Сообщение от Nexi99 Посмотреть сообщение
конечно это медленнее чем массив но быстрее чем if.
Да вроде выяснили уже 11 лет назад. Тема неактуальна, зачем прошлое ворошить?

0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17898 / 13994 / 5345
Регистрация: 17.03.2014
Сообщений: 28,652
Записей в блоге: 1
11.09.2022, 09:40
Цитата Сообщение от Nexi99 Посмотреть сообщение
Если верить этой инструкции https://docs.microsoft.com/en-... sm4---asm-
И какое интересно отношение имеет High-level shader language (HLSL) к C#?
0
3565 / 2506 / 1174
Регистрация: 14.08.2016
Сообщений: 8,216
11.09.2022, 15:02
в продолжение некропостинга: быстрее будет словарь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2022, 15:02
Помогаю со студенческими работами здесь

Что быстрее Цикл или коллекция
Доброе утро!) Ребят подскажите, кто в курсе какой вариант алгоритма будет работать быстрее Вариант с перебором 2-м циклом одной и...

Поиск элемента в массиве или ключа в хеше - что быстрее
Что будет быстрее работать: поиск элемента в массиве или ключа в словаре/хеше?

Что будет быстрее и рентабельние использовать XML или Sqlite?
Задача следующая: Получаю массив строк, и нужно узнать если ли каждая из этих строк в моей базе. Так вот что лучше мне подойдет для такой...

Обращение через индекс Dictionary или IndexOf, что быстрее / производительнее?
Смотрите есть строка: string dic = &quot;abcdefghijklmnopqrstuvwxyz&quot;; мне приходит символ (char) и мне надо выяснить положение этого...

Что лучше: switch или elseif?
Почитав в интернете так и не смог определиться что же всё-таки лучше использовать. Что конкретно вы сами используете и рекомендуете?...


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

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

Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер