вскроем правду:
имеем два скрипта:
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
|