Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Что лучше использовать if vs Switch?

#php #оптимизация


Добрый вечер. Всегда было интересно что лучше использовать переключатель switch или
оператор if для множества условий, в частности для каждого переборки условий. Но как
это по оптимизации, как бы чтобы реализовать switch надо больше программного кода,
чем для if. Кто проводил тесты подскажите пожалуйста.     


Ответы

Ответ 1



If vs. Switch Speed. По самому простому, свитч быстрее потому что эту не надо нечего решать - пришло значение - переключился на него - выполнил действие, в случае ифа - надо что-то с чем-то сравнить... =) (такое козырное объяснение на пальцах - для тех, кто будет говорить, что там только для шарпа, а в пхп все по другому =) )

Ответ 2



На мой взгляд, в подавляющем большинстве ситуаций, лучше вообще не использовать ни 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 я таки использую и советую использовать при написании парсеров.

Ответ 3



@Gorets - пришло значение - переключился на него - выполнил действие Это удивительно. Каким образом switch переключается? И отвечая на данный вопрос обратимся к мане http://php.net/manual/ru/control-structures.switch.php и находим: Замечание: Заметьте, что конструкция switch/case использует неточное сравнение (==). то есть делает сверку "так же" как и IF. Разница в скорости есть но она явно не обусловлена "магическим переключением" если верить тестам : If === работает быстрей в 3раза 28 µs if == также как и swich 77 µs

Комментариев нет:

Отправить комментарий