Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/176: Рейтинг темы: голосов - 176, средняя оценка - 4.69
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134

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

17.08.2011, 11:59. Показов 36402. Ответов 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
 Аватар для Элд Хасп
15955 / 11091 / 2864
Регистрация: 21.04.2018
Сообщений: 32,569
Записей в блоге: 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 / 5346
Регистрация: 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
Ответ Создать тему
Новые блоги и статьи
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть. Дело в том, что я. . .
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер