Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.02.2009, 13:29
DarkLight вне форума Посмотреть профиль Отправить личное сообщение для DarkLight Посетить домашнюю страницу DarkLight Найти все сообщения от DarkLight
  № 11  
Ответить с цитированием
DarkLight
ветеран форума
 
Аватар для DarkLight

Регистрация: May 2006
Адрес: Москва
Сообщений: 2,978
Отправить сообщение для DarkLight с помощью ICQ Отправить сообщение для DarkLight с помощью Skype™
гм, if-ы в бизнес-логике особо не позаменяешь. Часто можно применить Стратегию(Strategy), но в AS это не самый удобный паттерн, из-за отсутствия перегрузки функций в первую очередь. Плохой тон - это множественные точки выхода из функций, разложенные по if-ам.
__________________
4am is time to rock

Старый 21.02.2009, 15:51
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 12  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Ну гм... 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
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 13  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
В первом случае тоже не будет. Я часто пишу так:
Код AS3:
if (a != null && a.b) {
   // Иначе бы при а == null был бы exception
}

Старый 21.02.2009, 16:10
r_r_f_r вне форума Посмотреть профиль Отправить личное сообщение для r_r_f_r Найти все сообщения от r_r_f_r
  № 14  
Ответить с цитированием
r_r_f_r

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 224
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Вдогонку: оператор ? тоже рассматривается как if/else?
С учётом того что оператор ? работает быстрее чем if, то нет.
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
А в 1 случае будет?
Нет, не будет.

Старый 21.02.2009, 16:37
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 15  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
В первом случае тоже не будет проверяться.

Что касается операторов и 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.

Старый 21.02.2009, 19:41
r_r_f_r вне форума Посмотреть профиль Отправить личное сообщение для r_r_f_r Найти все сообщения от r_r_f_r
  № 16  
Ответить с цитированием
r_r_f_r

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 224
_etc, научите меня, неуча этому кунгфу

Старый 21.02.2009, 19:47
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 17  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Ммм, __etc, Спасибо.
Только вот:
Цитата:
Сообщение от r_r_f_r
С учётом того что оператор ? работает быстрее чем if, то нет.
Цитата:
Сообщение от __etc
По идее, второй вариант быстрее на миллиграмм.
Все же, какой?

Старый 21.02.2009, 19:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 18  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Все же, какой?
Да без разницы, на самом деле. Если она и есть, то настолько мизерная, что можно пренебречь. Я бы воспользовался первым, если выражение не очень сложное.


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

Старый 21.02.2009, 20:02
r_r_f_r вне форума Посмотреть профиль Отправить личное сообщение для r_r_f_r Найти все сообщения от r_r_f_r
  № 19  
Ответить с цитированием
r_r_f_r

Регистрация: Sep 2008
Адрес: Москва
Сообщений: 224
Ну чёрный пояс в виде спецификации мне помогает, но что за буковки у тебя написаны, для меня загадка, и они подробней, подскажи на какой полке бляха чудо пояса лежит

Старый 21.02.2009, 20:14
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 20  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Да вообще-то это Sothink SWF Decompiler показывает.

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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