![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|||||
Level 7 ![]() ![]() Класс: Маг Характер: True Neutral Раса: Эльф NWN: Скриптинг [Sn] ![]() |
LEX: Все началось с этого:
-------------------------- Быть может так проще?
Я просто к тому, что несколько строк, проверяющих условия рассовой принадлежности, стоит объеденить в одну. Гораздо легче читать Сообщение отредактировал Lex - Oct 18 2005, 15:58 |
||||
![]()
Сообщение
#2
|
|||||||
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
:) а мне проще как раз в том стиле, что у химерика. Кстати, так вроде и операций поменьше будет. Но тут я не сильно уверен. (вообще точно вложенные if работают быстрее чем много-условный if. Тут по сути дела так и есть. Женщина И рассы. можно
а можно
Так вот, первый вроде работает быстрее. :) По сути тот стиль, что в скрипте Chimeric и есть первый вариант. :) просто чуть по другому написаный - не вложение ифов, а обратные условия и вылет из скрипта (return FALSE) |
||||||
![]()
Сообщение
#3
|
|||
Level 7 ![]() ![]() Класс: Маг Характер: True Neutral Раса: Эльф NWN: Скриптинг [Sn] ![]() |
:xz: так а там не много-условные, и не вложенные. Я потому и написала :) Добавлено в 15:33 :angel: а вообще быстрее будет:
имхо Сообщение отредактировал AliceDiren - Oct 18 2005, 14:33 |
||
![]()
Сообщение
#4
|
|
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
:) где-то читал или кто-то мне говорил, что операция И в нсс сделана малек криво.
не помню подробностей (мб там все условия "И" проверяются, даже если уже 1 было ложно, толи еще какая фигня), но я для себя усвоил то, что эту штуку надо юзать пореже. :) |
![]()
Сообщение
#5
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Lex давай обсудим этот вопрос со всеми в отдельной теме. Мне тоже интересно как быстрее делать для кода проверки if...
|
![]()
Сообщение
#6
|
|||||||||
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
вскроем правду: имеем два скрипта: 1. несколько проверок одного условия.
2. одна проверка с несколькими условиями.
компилируем-декомпилируем 1.
2.
note: все нижеописанное имеет силу для проверок типа if (xx) return; суть: при проверке OR нескольких условий, после первого удовлетворяющегося происходит цепочка "холостых" операций пропусков остальных: LOGORxx, уже дающий 1; невыполняющийся переход JZ xxx; JMP на следущий LOGORxx; и пару-тройку операций работы со стеком. в случае нескольких проверок, первая же удовлетворяющаяся приведет к переходу на return. в остальных случаях (не "if (x) return") выгодней использовать несколько условий OR. в самом деле - не будете же вы копировать блоки, которые под if'ом стоят?! ;) да, и уж коль скоро речь идет об оптимизации, то не стоит по сто раз вызывать функции - гораздо быстрее(и компактнее) будет занести результат в переменную и уже ее проверять сто раз. edit: тэги, как всегда, не позакрывал... ;) Сообщение отредактировал dumbo - Oct 18 2005, 16:30 |
||||||||
![]()
Сообщение
#7
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
В итоге :)
1. Если в условии используется функция, особенно "сложная" - всяческие проверки поля зрения, поиск вещей\игроков, операции с itemproperty и прочее - обязательно запомните результат в переменной и с ней работайте. 2. Для условий типа "И" на первое место ставьте то, что скорее всего будет ложным. Как только до него дойдет - проверка прекратится. 3. Для условий типа "ИЛИ" на первом месте наоборот, наиболее вероятное истинное значение, по тем же причинам. По сути на производительность как-то заметно влияет только первый пункт, 2й и 3й - это просто "правильный" код :) |
![]()
Сообщение
#8
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Класс. Давно меня это мучало. Но слишком поздно и я не все вкурил что написано. :yes: С утра перечитаю...
|
![]()
Сообщение
#9
|
|
Level 9 ![]() Класс: Вор Характер: True Neutral Раса: Эльф NWN: Скриптинг [PW] ![]() |
нужно делать экспорт функций и использовать с++ :D (хочу нечто в нвн2)
|
![]()
Сообщение
#10
|
|
Level 8 ![]() ![]() ![]() Класс: Тайный Лучник Характер: Lawful Good Раса: Эльф ![]() |
Если уж речь у вас зашла о языках програмирования, то скажите:
- Dll, Delphi....и прочая фигня будет как-то арботать. Если будет, то скажите как. ОК? :this: |
![]()
Сообщение
#11
|
|||
Level 5 ![]() Класс: Обыватель Характер: Lawful Neutral Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
Эй-эй! Не оффтопим. :) Экспорт С++ программ в нсс это ты в другой теме разрабатывай :) |
||
![]()
Сообщение
#12
|
|||||||
Level 5 ![]() ![]() Класс: Рейнджер Характер: Neutral Good Раса: Человек ![]() |
Пожалуй, так будет эффективнее всего: ;)
Или нет? Я в этом не особо шарю, но код по крайней мере короче чем в примерах выше. (Значит лучше?)
И кстати, если условие - функция, то она вызывается только один раз и переменную заводжить не нужно. Где-то читал, что где там, где это возможно, лучше юзать switch/case, чем много if-ов. |
||||||
![]()
Сообщение
#13
|
|
Level 4 ![]() Класс: Маг Характер: Lawful Neutral Раса: Дракон NWN: Скриптинг [PW] ![]() |
Как раз-таки кэйсы намного тяжелее обрабатываются, нежели простая проверка условия. Намного проще прописывать if() else конструкцию, ибо , в принципе, с этой конструкцией и так все ясно. А вот с как кейсы обрабатываться будут, во много зависит от разработчиков интерпретаторов-компиляторов. Это так же верно и для скриптов, ибо они все равно транслируются в байт-код(в нормальных скриптовых системах :) ). По поводу использования переменных.
Порой лучше пожертвовать некоторым объемом памяти для скорости. Например GetModule(). В общем, непонятно, как и откуда берется хендл, по этому лучше такой вызов вынести отдельно. Например в событие загрузки модуля: PW_oMod = GetModule()(Это касается так же GetPCSpeaker() и подобных функций). А потом уж использовать PW_oMod. Что касается условий переходов, то следует минимизировать вычисления. Даже логические конструкции можно упростить. И если уж создаете глобальные переменные, то старайтесь их использовать по максимуму ибо у сервера постоянные лики памяти(одна из причин возникновения лагов). Полезно будет также глянуть и растактовку команд процессора. :) Сообщение отредактировал Misty Dragon - Oct 25 2005, 19:14 |
![]()
Сообщение
#14
|
|||||||||||
Level 9 ![]() Класс: Фея Характер: Chaotic Evil Раса: Тварь NWN: Скриптинг [PW] ![]() |
Misty Dragon, ничего не понял из твоего поста... :xz:
о чем идет речь - о простоте восприятия, "прописывания" или о скорости выполнения? что характерно, сие высказывание неверно в любом случае. ;) если говорить вообще(безотносительно nss), то switch в грамотных реализациях гораздо "легче" выполняется нежели куча if'ов - switch=один безусловный переход, if'ы=сколько if'ов, столько и условных переходов(не будем вдаваться в тонкости, просто отметим, что условный переход хуже безусловного).
зависит, и не во многом, а во всем ;) бродило мнение, что nss-switch плох, потому что он является по сути множественным if'ом... а вот судя по "декомпиле" Friedrich'а, оказывается, что он действительно раскладывается на много if'ов, но код генерится гораздо более приятный! :crazy:
опять не понял(экий непонятливый;)) - о каких переменных идет речь? глобальных переменных в nss нет. максимальный размах - файл скрипта. переменные скрипта лежат в стэке виртуальной машины, который очистится после окончания работы скрипта. если речь идет о "глобальных" переменных, которые получаются путем SetLocalXXX(GetModule(),.., то непонятен смысл занесения в оные самого хэндла модуля...
вот хоть тресни, а не могу понять, что именно ты хочешь сказать. какая связь между "глобальными переменными" и утечками памяти? ну и наконец, апофеоз этого поста:
НУ ПРИЧЕМ ЗДЕСЬ РАСТАКТОВКА КОМАНД ПРОЦЕССОРА?! 8( |
||||||||||
![]() ![]() |
Текстовая версия | Сейчас: 30th April 2025 - 02:43 |