![]() |
Разница между if, ? и switch/case
Интересна разница между ними с точки зрения производительности.
За все своё время программирования плодил тонны if`ов (если нужно), но очень редко пользовался switch/case`ом (мне сложнее его читать). Насколько такой подход был критичен с точки зрения производительности, или компилятор переведет все это в один и тот же байткод? |
не проверял на скорость, но как раз таки для меня более чтиабельно switch case, чем "тонны if'ов"
|
switch в байткоде и есть тонна строгих if.
|
Конструкция
Код AS3:
switch/case более читабельней, ведь хороший программист - это тот, кто пишет код понятный другим программистам, а не машине. |
Условие условию рознь. switch для случаев, когда условий (с if) больше 2-3 (то есть пост _Smirnoff мимо, иначе слишком громоздко) и в switch можно описать лишь одну ОДНО условие, в иных случахя без if/else if некуда.
|
Цитата:
|
Добавлю, что со swtich-case связано несколько багов компилятора, например использование E4X, такая конструкция не прочитается правильно:
Код AS3:
|
_Smirnoff, неа, это как раз плохой программист. Хороший пишет понятно и для тех и для других.
|
Код AS3:
Код AS3:
Код AS3:
|
вообще огромное количество больших конструкций if (тоже самое и switch) в небольшом проекте это плохой тон и низкий уровень испрользования фишек ооп...имхо
|
гм, if-ы в бизнес-логике особо не позаменяешь. Часто можно применить Стратегию(Strategy), но в AS это не самый удобный паттерн, из-за отсутствия перегрузки функций в первую очередь. Плохой тон - это множественные точки выхода из функций, разложенные по if-ам.
|
Ну гм... 5 Проверок значения переменной a:
Код AS1/AS2:
Код AS1/AS2:
Но как сказал __etc, раз в байткоде это и есть тонны if`ов, то беспокоиться нечего) Вдогонку: оператор ? тоже рассматривается как if/else? И кстати проверяет он условия все сверху вниз? Т.е. наиболее вероятные исходы при if/else if следует разместить в самом первом if, чтобы он не просчитывал остальные? Ну и ещё вдогонку: есть переменные a и b, оба булевы. Я пишу: Код:
if (a && b) ...Код:
if (a){ |
В первом случае тоже не будет. Я часто пишу так:
Код AS3:
|
Цитата:
Цитата:
|
В первом случае тоже не будет проверяться.
Что касается операторов и switch/if, то смотрим: Код AS3:
Код:
_as3_pushbyte 5Код AS3:
Код:
_as3_pushbyte 5Теперь switch/if: Код AS3:
Код:
#14 _as3_jump offset: 41[#34]Код AS3:
Код:
#57 _as3_getlocal <1> |
_etc, научите меня, неуча этому кунгфу:)
|
Ммм, __etc, Спасибо.
Только вот: Цитата:
Цитата:
|
Цитата:
r_r_f_r, сначала надо получить черный пояс :) |
Ну чёрный пояс в виде спецификации мне помогает, но что за буковки у тебя написаны, для меня загадка, и они подробней:), подскажи на какой полке бляха чудо пояса лежит:)
|
Да вообще-то это Sothink SWF Decompiler показывает.
|
Блин, я думал где-то такая чудо инфа имеется, спасибо:)
|
Читабельность любого кода это больше привычка форматировать код и давать понятные наименования переменным и командам, чем выбирать каким операторами его записывать).
На сколько мне известно анализ любого логического условия выполняется до тех пор пока у результата есть неопределенность: 1. a && b при a=false не будет дальше анализировать b, это излишняя операция 2. a || b при a=true не будет дальше анализировать b, это излишняя операция и т.д. Я придерживаюсь такой методики: Если условие простое и выполняется в одну операцию то стараюсь выполнять при помощи ? или if. Когда подразумевается многоступенчатая проверка if elseif ... то предпочитаю switch. На счет того что не видно какие условия проверки есть простой прием Код AS3:
|
Раз уж пошла такая пьянка, расскажите, как описанные выше способы соотносятся по быстродействию с хешами.
|
Свитч работает гораздо быстрее. Например,
if (val == 1) ... else if (val == 2) ... В данном случае проверяются все ифы, пока не дойдет до верного условия. А в случае с кейсом - компилятор строит такой код, который выполняет некоторые нехитрые арифметические операции с адресами, и таким образом происходит сразу прыжок на нужный код. Хотя я знаю, что это верно применительно к C++. |
godknowsiamgood, ни к С++ ни к АС ваши слова отношения не имеют.
|
Насколько я помню, оптимизирующие компиляторы C++ умеют делать таблицы перехода для больших switch (сотни case), вместо набора if'ов.
|
Цитата:
|
Цитата:
2iNils: не понял сути твоего поста =) |
Цитата:
|
Цитата:
It is well known that many C compilers will attempt to convert a switch statement into a jump table. |
Полная конструкция оператора switch - переключателя, предпологает наличие переменной, в зависимости от значений которой, ей сопоставляется исчерпывающий набор правил. В этом его суть - дает унифицированный, но часто избыточный код.
Полная конструкция if - условный оператор, служит для построения ветвящихся логических структур, где условия ветвления алгоритма могут иметь более гибкий характер. Такие ветвления более характерны для линейного программирования. |
Я бы сказал так)
Разница между if, ? и switch/case в том как вы ими пользуетесь) А по сути это одно и то же. Эффективность работы зависит больше от рационально построенного условия чем от того, какой из вариантов для анализа вы выберете. |
Предположим, нужно проверить переменную - если она вне диапозона, то присвоить ей новое значение и продолжить с ним. - Криво как то писать свич для одного условия.
|
godknowsiamgood, начнём с того, что сишные компиляторы самые умные в мире. лучше их никто код не оптимизирует. то что Вам где-то написали в открытую, что один кусочек во что-то переделывается, это ещё ничего не значит. на самом деле там переделывается всё и вся. одни тэмплэйты и и таблицы виртуальных методов чего стоят. от оригинального кода там и места живого не остаётся. из-за этого дебажить сишный код может только очень упорный человек, или очень талантливый. в болие-менее сложном проекте, ошибки из-за многоуровневой системы компиляции просто так не понять. на пример, описываете Вы метод add, а в ошибке видите что-то типа My_foo_ASD_namespace_Point_add_My_foo_ASD_namespace_PolatPoint. человек не понимающий всю цепочку работы компилятора, фиг поймёт, что это автосгенерированное имя основанное на куче других автосгенерированных имён, что бы создать уникальность, зато мы имеем темплейты. парой строчек можем описать неизвестное множество сущностей, которые будут создаваться и проверяться не в рантайме (как в джаве или АС3), а на этапе компиляции, и про то что они будут реально типизированы, а не мнимо, я вообще молчу. оптимизация уровня inline-методов, в сях достигла совершенства :) компиляторы начали сами считать какой метод сделать inline. и и даже если Вы сами его таковым не пометите, компилятор может оказаться умнее. и т.д. и т.п. в общем ставить в пример компиляторы си, не стоит. слишком разных размеров ягодки. в такие таблицы вобще не только кэйсы переделываются и не всегда.
|
Цитата:
|
Psycho Tiger, есть сильные сомнения, что свич в таких случаях сработает быстрее, а главное что программист вообще поймет логику работы своего алгоритма. Я к примеру, если вижу свич, то первая мысль - может еще чего в него дописать - подключить, а одиночный иф - видится вроде предохранителя на проводе. (пишу глядя на сетевой фильтр).
|
Построение ранга для запросов
Код AS3:
Код AS3:
Тот же код из первой строчки. Если диапазон большой скажем миллиард значений, то весь миллиард шагов делать проверку того что это первый фрагмент не стоит. Либо первый элемент(без запятой) добавить отдельно, либо просто сложить все значения а первую запятую удалить пост действием. Тем самым вы исключите 1 млрд проверок и замените их на конкатенацию. |
| Часовой пояс GMT +4, время: 22:10. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.