Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> if, &&, || - оптимизация, как быстрее проверки идут?
AliceDiren
сообщение Oct 18 2005, 14:17
Сообщение #1


Level 7
**

Класс: Маг
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [Sn]



LEX: Все началось с этого:

Neverwinter Script Source
int StartingConditional()
{
object oPC = GetPCSpeaker();

if (GetLocalString(oPC, "victorspoken") == "1") return FALSE;

if (GetGender(oPC) != GENDER_FEMALE) return FALSE;

if (GetRacialType(oPC) != RACIAL_TYPE_DWARF) return FALSE;

if (GetRacialType(oPC) != RACIAL_TYPE_GNOME) return FALSE;

if (GetRacialType(oPC) != RACIAL_TYPE_HALFLING) return FALSE;

return TRUE;
}

--------------------------
Быть может так проще?
Neverwinter Script Source
int StartingConditional()
{
object oPC = GetPCSpeaker();
int bResult = FALSE;

if(GetLocalString(oPC, "victorspoken")=="1")
return FALSE;

bResult = (GetRacialType(oPC) = RACIAL_TYPE_DWARF || GetRacialType(oPC) == RACIAL_TYPE_GNOME || GetRacialType(oPC) == RACIAL_TYPE_HALFLING) && (GetGender(oPC) == GENDER_FEMALE);

return bResult;
}


Я просто к тому, что несколько строк, проверяющих условия рассовой принадлежности, стоит объеденить в одну. Гораздо легче читать

Сообщение отредактировал Lex - Oct 18 2005, 15:58
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
dumbo
сообщение Oct 18 2005, 16:27
Сообщение #2


Level 9
Иконки Групп

Класс: Фея
Характер: Chaotic Evil
Раса: Тварь
NWN: Скриптинг [PW]



вскроем правду:

имеем два скрипта:

1. несколько проверок одного условия.
Neverwinter Script Source
void main()
{
  int i;
  if (i == 0x123) return;
  if (i == 0x321) return;
  if (i == 0x111) return;
  if (i == 0x222) return;
  i = 0x666;
}


2. одна проверка с несколькими условиями.
Neverwinter Script Source
void main()
{
  int i;
  if (i == 0x123 || i == 0x321 || i == 0x111 || i == 0x222) return;
  i = 0x666;
}


компилируем-декомпилируем
1.
CODE

00000008 42 000000D3              T 000000D3
0000000D 1E 00 00000008           JSR fn_00000015
00000013 20 00                    RETN
00000015 02 03                    RSADDI
00000017 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000001F 04 03 00000123           CONSTI 00000123
00000025 0B 20                    EQUALII
00000027 1F 00 00000018           JZ off_0000003F
0000002D 1B 00 FFFFFFFC           MOVSP FFFFFFFC
00000033 1D 00 0000009E           JMP off_000000D1
00000039 1D 00 00000006           JMP off_0000003F
0000003F 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
00000047 04 03 00000321           CONSTI 00000321
0000004D 0B 20                    EQUALII
0000004F 1F 00 00000018           JZ off_00000067
00000055 1B 00 FFFFFFFC           MOVSP FFFFFFFC
0000005B 1D 00 00000076           JMP off_000000D1
00000061 1D 00 00000006           JMP off_00000067
00000067 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000006F 04 03 00000111           CONSTI 00000111
00000075 0B 20                    EQUALII
00000077 1F 00 00000018           JZ off_0000008F
0000007D 1B 00 FFFFFFFC           MOVSP FFFFFFFC
00000083 1D 00 0000004E           JMP off_000000D1
00000089 1D 00 00000006           JMP off_0000008F
0000008F 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
00000097 04 03 00000222           CONSTI 00000222
0000009D 0B 20                    EQUALII
0000009F 1F 00 00000018           JZ off_000000B7
000000A5 1B 00 FFFFFFFC           MOVSP FFFFFFFC
000000AB 1D 00 00000026           JMP off_000000D1
000000B1 1D 00 00000006           JMP off_000000B7
000000B7 04 03 00000666           CONSTI 00000666
000000BD 01 01 FFFFFFF8 0004      CPDOWNSP FFFFFFF8, 0004
000000C5 1B 00 FFFFFFFC           MOVSP FFFFFFFC
000000CB 1B 00 FFFFFFFC           MOVSP FFFFFFFC
000000D1 20 00                    RETN


2.
CODE

00000008 42 000000E5              T 000000E5
0000000D 1E 00 00000008           JSR fn_00000015
00000013 20 00                    RETN
00000015 02 03                    RSADDI
00000017 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000001F 04 03 00000123           CONSTI 00000123
00000025 0B 20                    EQUALII
00000027 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000002F 1F 00 00000014           JZ off_00000043
00000035 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000003D 1D 00 00000016           JMP off_00000053
00000043 03 01 FFFFFFF8 0004      CPTOPSP FFFFFFF8, 0004
0000004B 04 03 00000321           CONSTI 00000321
00000051 0B 20                    EQUALII
00000053 07 20                    LOGORII
00000055 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000005D 1F 00 00000014           JZ off_00000071
00000063 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000006B 1D 00 00000016           JMP off_00000081
00000071 03 01 FFFFFFF8 0004      CPTOPSP FFFFFFF8, 0004
00000079 04 03 00000111           CONSTI 00000111
0000007F 0B 20                    EQUALII
00000081 07 20                    LOGORII
00000083 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
0000008B 1F 00 00000014           JZ off_0000009F
00000091 03 01 FFFFFFFC 0004      CPTOPSP FFFFFFFC, 0004
00000099 1D 00 00000016           JMP off_000000AF
0000009F 03 01 FFFFFFF8 0004      CPTOPSP FFFFFFF8, 0004
000000A7 04 03 00000222           CONSTI 00000222
000000AD 0B 20                    EQUALII
000000AF 07 20                    LOGORII
000000B1 1F 00 00000018           JZ off_000000C9
000000B7 1B 00 FFFFFFFC           MOVSP FFFFFFFC
000000BD 1D 00 00000026           JMP off_000000E3
000000C3 1D 00 00000006           JMP off_000000C9
000000C9 04 03 00000666           CONSTI 00000666
000000CF 01 01 FFFFFFF8 0004      CPDOWNSP FFFFFFF8, 0004
000000D7 1B 00 FFFFFFFC           MOVSP FFFFFFFC
000000DD 1B 00 FFFFFFFC           MOVSP FFFFFFFC
000000E3 20 00                    RETN


note: все нижеописанное имеет силу для проверок типа if (xx) return;

суть: при проверке OR нескольких условий, после первого удовлетворяющегося происходит цепочка "холостых" операций пропусков остальных: LOGORxx, уже дающий 1; невыполняющийся переход JZ xxx; JMP на следущий LOGORxx; и пару-тройку операций работы со стеком. в случае нескольких проверок, первая же удовлетворяющаяся приведет к переходу на return.

в остальных случаях (не "if (x) return") выгодней использовать несколько условий OR. в самом деле - не будете же вы копировать блоки, которые под if'ом стоят?! ;)

да, и уж коль скоро речь идет об оптимизации, то не стоит по сто раз вызывать функции - гораздо быстрее(и компактнее) будет занести результат в переменную и уже ее проверять сто раз.

edit: тэги, как всегда, не позакрывал... ;)

Сообщение отредактировал dumbo - Oct 18 2005, 16:30
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме
- AliceDiren   if, &&, || - оптимизация   Oct 18 2005, 14:17
- - Lex   QUOTE (AliceDiren @ Oct 18 2005, 15:17)Быть ...   Oct 18 2005, 14:23
- - AliceDiren   так а там не много-условные, и не вложенные. Я пот...   Oct 18 2005, 14:28
- - Lex   где-то читал или кто-то мне говорил, что операция ...   Oct 18 2005, 14:36
- - Aiwan   Lex давай обсудим этот вопрос со всеми в отдельно...   Oct 18 2005, 15:29
- - dumbo   вскроем правду: имеем два скрипта: 1. несколько ...   Oct 18 2005, 16:27
- - _kaa_   В итоге 1. Если в условии используется функция, о...   Oct 18 2005, 18:54
- - Aiwan   Класс. Давно меня это мучало. Но слишком поздно и ...   Oct 18 2005, 22:32
- - 2_advanced   нужно делать экспорт функций и использовать с++ (...   Oct 18 2005, 22:46
- - Nashman   Если уж речь у вас зашла о языках програмирования,...   Oct 18 2005, 23:27
- - Lex   QUOTE (2_advanced @ Oct 18 2005, 23:46)нужно...   Oct 18 2005, 23:43
- - Friedrich   QUOTE (dumbo @ Oct 18 2005, 16:27)несколько ...   Oct 22 2005, 20:27
- - Misty Dragon   Как раз-таки кэйсы намного тяжелее обрабатываются,...   Oct 25 2005, 19:08
- - dumbo   Misty Dragon, ничего не понял из твоего поста... ...   Oct 26 2005, 12:04


Ответить в эту темуОткрыть новую тему
5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 30th April 2025 - 09:16