11 / 11 / 4
Регистрация: 14.09.2009
Сообщений: 134
|
||||||
if или switch? что быстрее17.08.2011, 11:59. Показов 36418. Ответов 27
Метки нет Все метки)
(
Здравствуйте.
Подскажите пожалуйста,что быстрее будет выполняться много условий if ,или switch
Заранее спасибо
0
|
17.08.2011, 11:59 | |
Ответы с готовыми решениями:
27
Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!? Что быстрее - метод или свойство? Что быстрее умножение или деление? |
![]() 49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
|
|
17.08.2011, 13:04 | |
Не думаю, что замена конструкций языка даст хоть какую-то выгоду в производительности.. Смотри в сторону поиска наиболее эффективных алгоритмов (для конкретной задачи) и оптимизации найденых/разработанных (Подходящая книга - "Алгоритмы. Построение и анализ" Кормен)
1
|
12 / 12 / 2
Регистрация: 04.08.2011
Сообщений: 57
|
|||||||||||
17.08.2011, 22:51 | |||||||||||
Ну не знаю, если вместо этого:
0
|
![]() |
|
18.08.2011, 03:26 | |
![]() Решение
Конструкция 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 засекает время до работы программы и после ,выводя разницу .Аналогично можно подсчитывает время выполнения любых операций ![]()
2
|
мастер топоров
![]() 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;}их результаты примерно одинаковы .
![]()
4
|
9 / 9 / 2
Регистрация: 05.08.2011
Сообщений: 18
|
|
19.08.2011, 03:22 | |
Vitall, в коде со switch после первого выполнения условия, дальше не производится действий. При использовании if без else, каждый следующий if проверяется, т.е. этот код делает не одно и тоже. Но даже если вы напишите эквивалентный код, всегда будет существовать погрешность при сравнении скорости выполнения команд (из-за работы других программ, особенностей вызова той или иной функции и кучи других факторов, о которых даже не стоит задумываться). На mnds где-то писали, что подобные тесты никогда не дают верный результат. Плюс ко всему, когда if много, то с кучей else они выглядят менее компактно, чем switch, не говоря уже о том, что вы сами можете запутаться. В итоге применять их нужно, когда они более удобны и не забивать себе голову о том, кто из них быстрее. Dejust верно сказал, главное продумать алгоритм программы, это даст намного большую оптимизацию.
1
|
![]() 167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
|
|
21.08.2011, 00:40 | |
Дело как раз в конкретных случаях. Если есть необходимость в очень-очень быстром исполнении кода,
(например в логических играх с анализом дерева игры, которое растёт очень быстро), все стандартные библиотеки ни куда не годятся - надо делать свои структуры и обработчики под них - только тогда можно достичь приемлевого результата.
1
|
11.09.2022, 01:54 | |
Если верить этой инструкции https://docs.microsoft.com/en-... sm4---asm- то
switch будет быстрее т.к. его назначение вызвать тот блок номер которого указан в switch, перебора не происходит. Оператор уже знает через сколько байт нужно перепрыгнуть чтобы вызывать нужный уровень, об этом написано по ссылке которую я дал. Но если условий очень мало например 2 или 4 то лучше использовать if, а если много и речь идёт о вызове уровня то switch будет быстрее. В инструкции указано что switch может использовать только целые числа.Добавлено через 5 минут Оператор switch уже на стадии компиляции знает где какой блок находится и в реалтайм вызовет нужный блок, конечно это медленнее чем массив но быстрее чем if.
0
|
Модератор
![]() ![]() |
|
11.09.2022, 02:36 | |
При маленьком количестве условий вы вряд ли сможете получить между ними разницу существенную для ПРАКТИЧЕСКОГО приложения.
А большое количество условий вряд ли будете писать "ручками" в коде. В тех случаях когда стоит задача ультра оптимизации какого-то алгоритма для конкретной платформы, то лучше не "последние капли" из Шарпа выжимать, а создать наитивную библиотеку на плюсах и использовать её методы. Всё таки задача Шарпа это не соревнование в быстродействии, а попытка создания платформонезависимого кода исполняемого CLR. А универсальность уже требует каких-то жертв по оптимизации других параметров.
1
|
11.09.2022, 05:09 | |
0
|
Администратор
![]() ![]() |
|
11.09.2022, 09:40 | |
0
|
3565 / 2506 / 1174
Регистрация: 14.08.2016
Сообщений: 8,216
|
|
11.09.2022, 15:02 | |
в продолжение некропостинга: быстрее будет словарь
0
|
11.09.2022, 15:02 | ||||||
Помогаю со студенческими работами здесь
20
Что быстрее Цикл или коллекция Поиск элемента в массиве или ключа в хеше - что быстрее Что будет быстрее и рентабельние использовать XML или Sqlite? Обращение через индекс Dictionary или IndexOf, что быстрее / производительнее? Что лучше: switch или elseif? Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Результаты исследования от команды 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. . .
|