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

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

17.08.2011, 11:59. Показов 33998. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2011, 11:59
Ответы с готовыми решениями:

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

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

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

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

27
Мохаммед Али
131 / 70 / 5
Регистрация: 14.08.2009
Сообщений: 916
17.08.2011, 12:09 2
Цитата Сообщение от franken Посмотреть сообщение
что быстрее будет выполняться много условий if ,или switch
свичч
1
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
17.08.2011, 12:33  [ТС] 3
А про оптимизацию кода не подскажите книжечку?
0
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
17.08.2011, 13:04 4
Не думаю, что замена конструкций языка даст хоть какую-то выгоду в производительности.. Смотри в сторону поиска наиболее эффективных алгоритмов (для конкретной задачи) и оптимизации найденых/разработанных (Подходящая книга - "Алгоритмы. Построение и анализ" Кормен)
1
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
17.08.2011, 21:06  [ТС] 5
спасибо
0
12 / 12 / 2
Регистрация: 04.08.2011
Сообщений: 57
17.08.2011, 22:51 6
Ну не знаю, если вместо этого:
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
584 / 371 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
18.08.2011, 03:26 7
Лучший ответ Сообщение было отмечено как решение

Решение

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

Соответственно если вам нужно рассмотреть всего 2-3 варианта - то предпочтительнее использовать if.
А вот если более 4х - то switch будет работать быстрее.
5
773 / 553 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
18.08.2011, 23:29 8
Для того что бы реально убедиться кто быстрее предлагаю запустить следующие прогу сначала с 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
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
19.08.2011, 01:13 9
Vitall, не вариант ибо перебора не 300000000, а только 3. вот если бы вы написали 300000000 условий или столько же switch - тогда можно было бы проверять, а так надеяться на накопление какой-то погрешности не стоит, она может возникнуть сама собой
0
773 / 553 / 80
Регистрация: 03.07.2011
Сообщений: 1,020
19.08.2011, 01:58 10
Увеличить кол-во условий кейсов до 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 11
Vitall, в коде со switch после первого выполнения условия, дальше не производится действий. При использовании if без else, каждый следующий if проверяется, т.е. этот код делает не одно и тоже. Но даже если вы напишите эквивалентный код, всегда будет существовать погрешность при сравнении скорости выполнения команд (из-за работы других программ, особенностей вызова той или иной функции и кучи других факторов, о которых даже не стоит задумываться). На mnds где-то писали, что подобные тесты никогда не дают верный результат. Плюс ко всему, когда if много, то с кучей else они выглядят менее компактно, чем switch, не говоря уже о том, что вы сами можете запутаться. В итоге применять их нужно, когда они более удобны и не забивать себе голову о том, кто из них быстрее. Dejust верно сказал, главное продумать алгоритм программы, это даст намного большую оптимизацию.
1
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
19.08.2011, 10:56  [ТС] 12
Спасибо! очень помогли,особенно Vitall.
0
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
19.08.2011, 21:44 13
В данном случае я бы сделал так:
C#
1
2
3
4
5
public static int [] vectCase =    { 0,0,0,3,3,3};
 
int find( int z) {
    return  vectCase[z];
}
И ни какого линейного поиска.
0
мастер топоров
916 / 741 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
20.08.2011, 00:21 14
chessman1, только в случае INumerable
0
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
21.08.2011, 00:40 15
Цитата Сообщение от Koran Посмотреть сообщение
chessman1, только в случае INumerable
Дело как раз в конкретных случаях. Если есть необходимость в очень-очень быстром исполнении кода,
(например в логических играх с анализом дерева игры, которое растёт очень быстро), все стандартные
библиотеки ни куда не годятся - надо делать свои структуры и обработчики под них - только тогда
можно достичь приемлевого результата.
1
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,790
Записей в блоге: 4
11.09.2022, 01:54 16
Если верить этой инструкции https://docs.microsoft.com/en-... sm4---asm- то switch будет быстрее т.к. его назначение вызвать тот блок номер которого указан в switch, перебора не происходит. Оператор уже знает через сколько байт нужно перепрыгнуть чтобы вызывать нужный уровень, об этом написано по ссылке которую я дал. Но если условий очень мало например 2 или 4 то лучше использовать if, а если много и речь идёт о вызове уровня то switch будет быстрее. В инструкции указано что switch может использовать только целые числа.

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

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

Не по теме:

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

0
Администратор
Эксперт .NET
16989 / 13348 / 5209
Регистрация: 17.03.2014
Сообщений: 27,293
Записей в блоге: 1
11.09.2022, 09:40 19
Цитата Сообщение от Nexi99 Посмотреть сообщение
Если верить этой инструкции https://docs.microsoft.com/en-... sm4---asm-
И какое интересно отношение имеет High-level shader language (HLSL) к C#?
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
11.09.2022, 15:02 20
в продолжение некропостинга: быстрее будет словарь
0
11.09.2022, 15:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2022, 15:02
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru