content:
Stack Overflow на русском — это сайт вопросов и ответов для программистов. Присоединяйтесь! Регистрация займёт не больше минуты.
Присоединиться к сообществу
Любой может задать вопрос
Любой может ответить
Лучшие ответы получают голоса и поднимаются наверх
Главная
Публичные
Вопросы
Метки
Участники
Неотвеченные
Что лучше использовать if vs Switch?
Задать вопрос
Вопрос задан 9 лет 4 месяца назад
Последняя активность 4 года 6 месяцев назад
Просмотрен 12k раза
5
1
Добрый вечер. Всегда было интересно что лучше использовать переключатель switch или оператор if для множества условий, в частности для каждого переборки условий. Но как это по оптимизации, как бы чтобы реализовать switch надо больше программного кода, чем для if. Кто проводил тесты подскажите пожалуйста.
php оптимизация
Поделиться
Улучшить вопрос
Отслеживать
изменён 27 июл '12 в 20:39
Node_pro
задан 27 июл '12 в 20:38
Node_proNode_pro
7,98544 золотых знака2929 серебряных знаков4949 бронзовых знаков
1
При выполнении скрипта все if становятся switch, поэтому switch быстрее. Нужно использовать то что логичнее. Для сравнения: if. А для выбора из списка: switch
– VasyOk
28 июл '12 в 18:05
добавить комментарий |
3 ответа 3
Текущие По дате публикации Голоса
6
На мой взгляд, в подавляющем большинстве ситуаций, лучше вообще не использовать ни switch, ни много if'ов.
Грубо говоря вместо:
switch( state ) {
  case(0):

  break;
  case(1):

  break;
  case(2):

  break;
  case(N):

  break;
  default: ...
}
На мой взгляд, когда это возможно ( а возможно это, скорее всего, всегда т.к. я уже наверное больше года не использовал switch :) ), лучше писать что-то типа
// PHP 5.3+ использую анонимные функции
$cases = array(
 function() {

 },
 function() {

 },
 // ...
);
if( !empty( $cases[$state] ) ) {
   $handler = $cases[$state];
   $handler();
}
else {
   // default
}

// аналогично JS
var cases = [function(){},function(){},...];
if( cases[ state ] ) {
  cases[ state ]();
}
else {
  // default
}
На мой взгляд, такой подход, в первую очередь, более гибкий в плане возможных будущих изменений и, что немаловажно, непосредственно, читабельности.
К тому-же я эстетически неперевариваю ни 100500 if, else if блоков, но switch. Довольно часто, когда кто-то начинает писать логику вида if else if - он не может остановиться, в конечном счете код превращается в нечитабельное месиво. Но у if else, на самом деле, другое применение. Некоторые программисты сознательно используют такую конструкцию вместо switch. И я их понимаю, на мой взгляд синтаксис switch просто отвратителен ( независимо от языка, хотя, возможно, где-то он реализован красивее, но я таких не знаю да и речь сейчас не о них )
Если же речь о производительности, то это 100% не то, что нужно оптимизировать, с большим трудом себе представляю PHP код, который проседает на if else if or switch.
Справедливости ради - switch может хорошо оптимизироваться компилятором, но для PHP это не актуально :)
В примерах я рассматривал целочисленные cas'ы, но, я думаю, что и так понятно, что для строковых cas'ов просто напросто используются ассоциативный массив в PHP и Object hash нотация в JavaScript. Т.е. все что измениться, это непосредственно объявление cas'ов, остальная логика не меняется.
UPD: каюсь, немного соврал. switch я таки использую и советую использовать при написании парсеров.
Поделиться
Улучшить ответ
Отслеживать
изменён 27 июл '12 в 21:28
ответ дан 27 июл '12 в 20:58
user3545user3545
4
1
категорически несогласен. ко всему же, смотря на твой код - это вообще какой-то велосипед, смесь прозрачного в понимании switch с if, зашитым в массив вариантов действий... но если это общая пхп-практика - тогда пусть она такой и остается и такие методы дальше пхп не расходятся...
– Gorets
27 июл '12 в 21:05
@Gorets - я на PHP уже очень давно не пишу, не переживай, не разойдется. Я не ору что-бы все так делали, лишь высказал свое мнение ( в контексте PHP это действительно что-то необычное, но в контексте JS распостраненная практика, которая, чисто к слову, может, в некоторых случаях дать значительный прирост производительности, по сравнению с switch ) Прозрачный в понимании switch? Возможно switch и прозрачен, но, лично я, не могу назвать его лаконичным. К тому-же, когда размер switcha достигает овер 100+ case'ов код становиться полным... ну вы понимаете о чем я
– user3545
27 июл '12 в 21:10
так я тоже высказываю сугубо личное мнение, и не на пхп и не на жс не пишу... ну и switch с больше, чем 10 значение(или if) - любому будет глаз резать.. в общем как и твой способ, представь var cases = [function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},function(){},...];
– Gorets
27 июл '12 в 21:16
@Gorets - вы смеетесь? var cases = [ function() { // ..... }, function() { // ..... }, function() { // ..... }, // ..... ] Если у вас проблемы с пониманием того, как по нормальному форматировать код, то это не ко мне. К тому-же, про switch длиною в овер 100500 case'ов я уже писал. К тому-же про swtch длиной ов
– user3545
27 июл '12 в 21:19
добавить комментарий |
5
If vs. Switch Speed.
По самому простому, свитч быстрее потому что эту не надо нечего решать - пришло значение - переключился на него - выполнил действие, в случае ифа - надо что-то с чем-то сравнить... =) (такое козырное объяснение на пальцах - для тех, кто будет говорить, что там только для шарпа, а в пхп все по другому =) )
Поделиться
Улучшить ответ
Отслеживать
изменён 23 мая '17 в 12:39
Дух сообществаБот
1
ответ дан 27 июл '12 в 20:45
GoretsGorets
12.3k11 золотой знак1818 серебряных знаков4343 бронзовых знака
3
2
Если не прав - поправьте, но: switch( condition ) { case someValue: // как вы думаете что здесь происходит? // именно сравнение condition с someValue и происходит break; }
– user3545
27 июл '12 в 21:02
1
я немного не правильно сформировал идею. по правилам в someValue - должны быть константные значение, что позволит компилятору сделать хэш-меп, и по приходу значения - сразу найти, за константное время, и выполнить действие, в случае с if - значение буду сравниваться дольше.
– Gorets
27 июл '12 в 21:10
1
@Gorets - я понимаю о чем вы, просто я сильно сомневаюсь что PHP интерпретатор это делает ( В первую очередь вопрос о PHP. Не утверждаю, возможно я не прав ). На самом деле, когда switch небольшой, его, практически всегда, можно избежать, либо сделать что-то типа того, о чем писал я. А если switch большой, значит вы определенно что-то делаете не так :)
– user3545
27 июл '12 в 21:16
добавить комментарий |
4
@Gorets - пришло значение - переключился на него - выполнил действие
Это удивительно. Каким образом switch переключается? И отвечая на данный вопрос обратимся к мане http://php.net/manual/ru/control-structures.switch.php и находим: Замечание:
Заметьте, что конструкция switch/case использует неточное сравнение (==). то есть делает сверку "так же" как и IF. Разница в скорости есть но она явно не обусловлена "магическим переключением" если верить тестам : If === работает быстрей в 3раза 28 µs if == также как и swich 77 µs
Поделиться
Улучшить ответ
Отслеживать
ответ дан 25 мая '17 в 8:48
lastronlastron
4111 бронзовый знак
добавить комментарий |
Ваш ответ
Спасибо за ваш ответ на Stack Overflow на русском!
Пожалуйста, убедитесь, что публикуемое сообщение отвечает на поставленный вопрос. Предоставьте как можно больше деталей, расскажите про проведенное исследование!
Но избегайте …
Просьб помощи, уточнений или ответов на темы не относящиеся к вопросу.
Ответов основанных на мнениях; приводите аргументы основанные только на реальном опыте.
Также, обратите внимание на заметку в справочном центре о том, как писать ответы.
Черновик сохранён
Черновик удалён
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Submit
Отправить без регистрации
Имя
Почта
Необходима, но никому не показывается
Отправить без регистрации
Имя
Почта
Необходима, но никому не показывается
Отправить ответ
Отменить
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php оптимизация или задайте свой вопрос.
Важное на Мете
New responsive Activity page
Reducing the weight of our footer
Похожие
5
Что лучше использовать: сессии или куки?
2
Как эффективней реализовать случайную генерацию математического выражения и его расчёт?
2
Что лучше использовать null или unset
2
Что лучше использовать HTTP-заголовки или meta-тэги?
2
Что лучше использовать в mysql?
1
Общий механизм взаимодействия с бд
1
Как лучше реализовать распределение ролей и прав?
1
Как правильно выводить шаблоны?
1
Что лучше использовать для рассылки писем?
Лента вопроса
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
lang-php
Stack Overflow на русском
Тур
Справка
Чат
Связаться с нами
Оставить отзыв
Мобильная версия
Компания
Stack Overflow
Командам
Рекламируйте с нами
Наймите разработчика
Вакансии для разработчиков
О компании
Упоминания в СМИ
Соглашение
Политика конфиденциальности
Условия использования
Настройки файлов cookie
Политика о Cookie
Stack Exchange Network
Технологии
Культура и отдых
Жизнь и искусство
Наука
Специализация
Бизнес
API
Данные
Блог
Facebook
Твиттер
LinkedIn
Instagram
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.12.9.40950
Stack Overflow на русском лучше работает с включенным JavaScript
Ваша конфиденциальность
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.


content: Текст доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия. Подробнее см. Условия использования.

warc-identified-content-language: rus,bel,nno

warc-type: conversion

content-type: text/plain

label: ru