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

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

17.08.2011, 11:59. Просмотров 21589. Ответов 14
Метки нет (Все метки)


Здравствуйте.
Подскажите пожалуйста,что быстрее будет выполняться много условий 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/большое число? Большие числа приблизительно...

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

14
Мохаммед Али
131 / 69 / 5
Регистрация: 14.08.2009
Сообщений: 916
17.08.2011, 12:09 2
Цитата Сообщение от franken Посмотреть сообщение
Здравствуйте.
Подскажите пожалуйста,что быстрее будет выполняться много условий 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: ...([B]если тут в конце break ставить то свич быстрее[/B])
 
....
case 5:.....
Подскажите книжку какую где можно прочитать про быстроту выполнения программного кода.
Заранее спасибо
свичч
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
581 / 368 / 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
765 / 545 / 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
мастер топоров
903 / 728 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
19.08.2011, 01:13 9
Vitall, не вариант ибо перебора не 300000000, а только 3. вот если бы вы написали 300000000 условий или столько же switch - тогда можно было бы проверять, а так надеяться на накопление какой-то погрешности не стоит, она может возникнуть сама собой
0
765 / 545 / 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
8 / 8 / 2
Регистрация: 05.08.2011
Сообщений: 18
19.08.2011, 03:22 11
Vitall, в коде со switch после первого выполнения условия, дальше не производится действий. При использовании if без else, каждый следующий if проверяется, т.е. этот код делает не одно и тоже. Но даже если вы напишите эквивалентный код, всегда будет существовать погрешность при сравнении скорости выполнения команд (из-за работы других программ, особенностей вызова той или иной функции и кучи других факторов, о которых даже не стоит задумываться). На mnds где-то писали, что подобные тесты никогда не дают верный результат. Плюс ко всему, когда if много, то с кучей else они выглядят менее компактно, чем switch, не говоря уже о том, что вы сами можете запутаться. В итоге применять их нужно, когда они более удобны и не забивать себе голову о том, кто из них быстрее. Dejust верно сказал, главное продумать алгоритм программы, это даст намного большую оптимизацию.
0
11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
19.08.2011, 10:56  [ТС] 12
Спасибо! очень помогли,особенно Vitall.
0
166 / 95 / 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
мастер топоров
903 / 728 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
20.08.2011, 00:21 14
chessman1, только в случае INumerable
0
166 / 95 / 23
Регистрация: 13.03.2011
Сообщений: 402
21.08.2011, 00:40 15
Цитата Сообщение от Koran Посмотреть сообщение
chessman1, только в случае INumerable
Дело как раз в конкретных случаях. Если есть необходимость в очень-очень быстром исполнении кода,
(например в логических играх с анализом дерева игры, которое растёт очень быстро), все стандартные
библиотеки ни куда не годятся - надо делать свои структуры и обработчики под них - только тогда
можно достичь приемлевого результата.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2011, 00:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.