Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Разница между if, ? и switch/case (http://www.flasher.ru/forum/showthread.php?t=121698)

DarkLight 21.02.2009 13:29

гм, if-ы в бизнес-логике особо не позаменяешь. Часто можно применить Стратегию(Strategy), но в AS это не самый удобный паттерн, из-за отсутствия перегрузки функций в первую очередь. Плохой тон - это множественные точки выхода из функций, разложенные по if-ам.

Psycho Tiger 21.02.2009 15:51

Ну гм... 5 Проверок значения переменной a:
Код AS1/AS2:

switch a
case break;
case break;
case breakl
...

или

Код AS1/AS2:

if (a==...)
else if (a==...)
else if (a==...)
else if (a==...)
else if (a==...)

Мне последний более понятен - я читаю строчку - я ВИЖУ имя переменной, не смотря вверх - и читаю код более быстро. Это в примере выше все просто, а если команд много - то найти свич - это какое то время, а после нужно вернуться в место case`а. Если есть прокрутка кода (т.е. кода этих условий больше, чем на один экран) - это тратит время, согласитесь.
Но как сказал __etc, раз в байткоде это и есть тонны if`ов, то беспокоиться нечего)
Вдогонку: оператор ? тоже рассматривается как if/else?
И кстати проверяет он условия все сверху вниз? Т.е. наиболее вероятные исходы при if/else if следует разместить в самом первом if, чтобы он не просчитывал остальные?
Ну и ещё вдогонку: есть переменные a и b, оба булевы.
Я пишу:
Код:

if (a && b) ...
но могу ведь и
Код:

if (a){
if (b){
...
}
}

Теперь мне интересно, если a=false, то во 2 случае проверка b вообще производиться не будет. А в 1 случае будет? Если нет - это ведь какая никакая экономия CPU =)

Яски 21.02.2009 16:06

В первом случае тоже не будет. Я часто пишу так:
Код AS3:

if (a != null && a.b) {
  // Иначе бы при а == null был бы exception
}


r_r_f_r 21.02.2009 16:10

Цитата:

Сообщение от Psycho Tiger (Сообщение 800126)
Вдогонку: оператор ? тоже рассматривается как if/else?

С учётом того что оператор ? работает быстрее чем if, то нет.
Цитата:

Сообщение от Psycho Tiger (Сообщение 800126)
А в 1 случае будет?

Нет, не будет.

etc 21.02.2009 16:37

В первом случае тоже не будет проверяться.

Что касается операторов и switch/if, то смотрим:

Код AS3:

a = 5 ? 10 : 8;

На выходе:
Код:

                        _as3_pushbyte 5
                        _as3_iffalse offset: 7[#10]
                        _as3_pushbyte 10
                        _as3_convert_d
                        _as3_jump offset: 3[#12]
#10                        _as3_pushbyte 8
                        _as3_convert_d
#12                        _as3_convert_d
                        _as3_setlocal <1>

Код AS3:

if (5) a = 10;
else a = 8;

На выходе:
Код:

                        _as3_pushbyte 5
                        _as3_iffalse offset: 8[#11]
                        _as3_pushbyte 10
                        _as3_convert_d
                        _as3_setlocal <1>
                        _as3_jump offset: 4[#14]
#11                        _as3_pushbyte 8
                        _as3_convert_d
                        _as3_setlocal <1>

Разница в лишней конвертации в первом случае и двойному setlocal во втором. По идее, второй вариант быстрее на миллиграмм.

Теперь switch/if:

Код AS3:

        switch (a) {
                case 4:
                        trace(4);
                case 10:
                        trace(a);
                        break;
                case 8:
                        trace(a);
                        break;
                default:
                        trace(a);
        }

На выходе:

Код:

#14                        _as3_jump offset: 41[#34]
                        _as3_label
                        _as3_findpropstrict trace
                        _as3_pushbyte 4
                        _as3_callpropvoid trace(param count:1)
                        _as3_label
                        _as3_findpropstrict trace
                        _as3_getlocal <1>
                        _as3_callpropvoid trace(param count:1)
                        _as3_jump offset: 94[#57]
                        _as3_label
                        _as3_findpropstrict trace
                        _as3_getlocal <1>
                        _as3_callpropvoid trace(param count:1)
                        _as3_jump offset: 83[#57]
                        _as3_label
                        _as3_findpropstrict trace
                        _as3_getlocal <1>
                        _as3_callpropvoid trace(param count:1)
                        _as3_jump offset: 72[#57]
#34                        _as3_getlocal <1>
                        _as3_setlocal <2>
                        _as3_pushbyte 4
                        _as3_getlocal <2>
                        _as3_ifstrictne offset: 6[#41]
                        _as3_pushbyte 0
                        _as3_jump offset: 38[#55]
#41                        _as3_pushbyte 10
                        _as3_getlocal <2>
                        _as3_ifstrictne offset: 6[#46]
                        _as3_pushbyte 1
                        _as3_jump offset: 25[#55]
#46                        _as3_pushbyte 8
                        _as3_getlocal <2>
                        _as3_ifstrictne offset: 6[#51]
                        _as3_pushbyte 2
                        _as3_jump offset: 12[#55]
#51                        _as3_jump offset: 6[#54]
                        _as3_pushbyte 3
                        _as3_jump offset: 2[#55]
#54                        _as3_pushbyte 3
#55                        _as3_kill <2>
                        _as3_lookupswitch -66(3)[-96, -88, -77, -66]

Аналог (вроде такой, если ничего не путаю):

Код AS3:

        if (a === 4) trace(4);
        if (a === 4 || a === 10) {
                trace(a);
        } else if (a === 8) {
                trace(a);
        } else {
                trace(a);
        }

На выходе:

Код:

#57                        _as3_getlocal <1>
                        _as3_pushbyte 4
                        _as3_ifstrictne offset: 7[#63]
                        _as3_findpropstrict trace
                        _as3_pushbyte 4
                        _as3_callpropvoid trace(param count:1)
#63                        _as3_getlocal <1>
                        _as3_pushbyte 4
                        _as3_strictequals
                        _as3_dup
                        _as3_iftrue offset: 5[#72]
                        _as3_pop
                        _as3_getlocal <1>
                        _as3_pushbyte 10
                        _as3_strictequals
#72                        _as3_iffalse offset: 10[#77]
                        _as3_findpropstrict trace
                        _as3_getlocal <1>
                        _as3_callpropvoid trace(param count:1)
                        _as3_jump offset: 23[#87]
#77                        _as3_getlocal <1>
                        _as3_pushbyte 8
                        _as3_ifstrictne offset: 10[#84]
                        _as3_findpropstrict trace
                        _as3_getlocal <1>
                        _as3_callpropvoid trace(param count:1)
                        _as3_jump offset: 6[#87]
#84                        _as3_findpropstrict trace
                        _as3_getlocal <1>
                        _as3_callpropvoid trace(param count:1)

В целом, switch на тех же операторах работает, но организация участков кода иная. Плюс lookupswitch.

r_r_f_r 21.02.2009 19:41

_etc, научите меня, неуча этому кунгфу:)

Psycho Tiger 21.02.2009 19:47

Ммм, __etc, Спасибо.
Только вот:
Цитата:

Сообщение от r_r_f_r
С учётом того что оператор ? работает быстрее чем if, то нет.

Цитата:

Сообщение от __etc
По идее, второй вариант быстрее на миллиграмм.

Все же, какой?

etc 21.02.2009 19:56

Цитата:

Сообщение от Psycho Tiger (Сообщение 800157)
Все же, какой?

Да без разницы, на самом деле. Если она и есть, то настолько мизерная, что можно пренебречь. Я бы воспользовался первым, если выражение не очень сложное.


r_r_f_r, сначала надо получить черный пояс :)

r_r_f_r 21.02.2009 20:02

Ну чёрный пояс в виде спецификации мне помогает, но что за буковки у тебя написаны, для меня загадка, и они подробней:), подскажи на какой полке бляха чудо пояса лежит:)

etc 21.02.2009 20:14

Да вообще-то это Sothink SWF Decompiler показывает.


Часовой пояс GMT +4, время: 22:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.