Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    Приёмы для исследования кода на Pawn

    В данной статье приведены методы, которые будут использоваться в доказательствах в предстоящем цикле уроков по скриптингу.
    Отдельная тема нужна для того, чтобы не засорять пояснениями другие статьи и при этом развёрнуто описать каждый из приёмов.
    Касаемо pawn.cfg, ключи компилятора записываются в нём в одну строку через пробел (пример: -d0 -O2 -v2).


    1. Получение ассемблерного листинга.
    В папке с компилятором создайте файл "pawn.cfg". В этот файл можно вписать параметры командной строки для компилятора. Впишите в файл "-a" (без кавычек) и сохраните.
    Компилятор при запуске откроет pawn.cfg и, найдя ключ "-a", сгенерирует ассемблерный листинг (*.asm) из файла *.pwn (при этом файл *.amx создан не будет!)
    Также можно дизассемблировать уже готовый файл *.amx, использовав утилиту pawndisasm. Этой утилиты нет в стандартном комплекте сервера SA:MP для Windows (равно как и нет в стандартной сборке Pawn 3.2.3664 - она была бэкпортирована из 3.3.3875), но она есть в модифицированной версии компилятора от Zeex.
    Благодаря этому приёму можно узнать, во что превратится исходный код после компиляции и судить о целесообразности тех или иных оптимизационных приёмов.

    2. Профилирование.
    Профилирование (в информатике) - сбор характеристик работы программы.
    Не так давно я выкладывал профайлер для измерения времени выполнения двух отрывков кода на Pawn.
    С его помощью также можно судить о целесообразности разных вариантов кода, сравнив их производительность.

    3. Информация о требованиях к памяти.
    В файле pawn.cfg добавьте ключ "-v2". Это заставит компилятор выводить подробную инфу о требованияк скрипта к памяти: объём заголовка файла *.amx, кода, данных и объём стека/кучи (как общий объём, так и используемый).
    Таким образом, можно узнать, сколько памяти расходуется при использовании разных образцов кода.

    4. Оптимизация генерируемого кода.
    По умолчанию компилятор Pawn никак не оптимизирует генерируемый код.
    Однако, в ситуациях, когда требуется оценить производительность кода, оптимизации иногда могут изменить результаты тестов. Кроме того, код после оптимизации, как правило, более компактный и его легче разбирать в ассемблерных листингах.
    За оптимизацию генерируемых инструкций в компиляторе отвечает ключ -OX:
    -O0 - никаких оптимизаций.
    -O1 - JIT-совместимые оптимизации.
    -O2 - то же самое, что в -O1, но также используются оптимизации, не совместимые с JIT.
    Код, скомпилированный с ключом -O2 не запустится, если использовать плагин JIT для SA:MP, поэтому целесообразно указывать в pawn.cfg ключ -O1.

    5. Удаление отладочной информации.
    Ключ компилятора -dX отвечает за добавление отладочной информации:
    -d0 - не добавлять отладочную информацию.
    -d1 - добавить проверки времени выполнения (например, проверки на выход за пределы массивов).
    -d2 - добавить проверки времени выполнения и символьную информацию (названия функций и переменных).
    -d3 - то же самое, что и -d2, но также отключает оптимизацию генерируемого кода (-O0).
    Указав в pawn.cfg ключ -d0, можно убрать из кода лишние инструкции (break, bounds), что опять же может быть полезно при чтении дизассемблерных листингов.


    Тема будет дополняться.


    Специально для Pro-Pawn.ru
    Не разрешается копирование данной статьи на других ресурсах без разрешения автора.
    Последний раз редактировалось Daniel_Cortez; 11.10.2015 в 00:54. Причина: 5
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 16 пользователя(ей) сказали cпасибо:
    $continue$ (10.10.2015) Alanchick (13.07.2016) Battista (28.07.2018) Desulaid (10.10.2015) L0ndl3m (10.10.2015) Nurick (11.10.2015) Paradox (12.07.2018) Quman (10.10.2015) Sp1ke (20.07.2016) Spectrum (09.10.2015) Unreal (10.10.2015) vovandolg (16.04.2016) Zaur_Lumanov (11.10.2015) [ForD] (09.10.2015) ^_^ (09.10.2015)
  3. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Добавил пункты 3, 4 и 5. Также дополнил пункт 1 информацией об утилите pawndisasm.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #3
    Аватар для Zaur_Lumanov
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.05.2015
    Адрес
    Москва
    Сообщений
    18
    Репутация:
    8 ±
    Какие могут быть проблемы, при использовании компилятора Zeex?

  5. #4
    Аватар для Unreal
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.09.2014
    Сообщений
    133
    Репутация:
    4 ±
    -O1 - JIT-совместимые оптимизации.
    можно по подробнее, я использую JIT plugin, т.е если я и это "поставлю", то будет еще лучше ?

  6. #5
    Аватар для jeraqiv
    Пользователь

    Статус
    Оффлайн
    Регистрация
    28.06.2015
    Адрес
    Двумерный массив
    Сообщений
    77
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    В данной статье приведены методы, которые будут использоваться в доказательствах в предстоящем цикле уроков по скриптингу.
    Отдельная тема нужна для того, чтобы не засорять пояснениями другие статьи и при этом развёрнуто описать каждый из приёмов.
    Касаемо pawn.cfg, ключи компилятора записываются в нём в одну строку через пробел (пример: -d0 -O2 -v2).


    1. Получение ассемблерного листинга.
    В папке с компилятором создайте файл "pawn.cfg". В этот файл можно вписать параметры командной строки для компилятора. Впишите в файл "-a" (без кавычек) и сохраните.
    Компилятор при запуске откроет pawn.cfg и, найдя ключ "-a" сгенерирует ассемблерный листинг (*.asm) из файла *.pwn (при этом файл *.amx создан не будет!)
    Также можно дизассемблировать уже готовый файл *.amx, использовав утилиту pawndisasm. Этой утилиты нет в стандартном комплекте сервера SA:MP для Windows (равно как и нет в стандартной сборке Pawn 3.2.3664 - она была бэкпортирована из 3.3.3875), но она есть в модифицированной версии компилятора от Zeex.
    Благодаря этому приёму можно узнать, во что превратится исходный код после компиляции и судить о целесообразности тех или иных вариантов кода.

    2. Профилирование.
    Профилирование (в информатике) - сбор характеристик работы программы.
    Не так давно я выкладывал профайлер для измерения времени выполнения двух отрывков кода на Pawn.
    С его помощью также можно судить о целесообразности разных вариантов кода, сравнив их производительность.

    3. Информация о требованиях к памяти.
    В файле pawn.cfg добавьте ключ "-v2". Это заставит компилятор выводить подробную инфу о требованияк скрипта к памяти: объём заголовка файла *.amx, кода, данных и объём стека/кучи (как общий объём, так и используемый).
    Таким образом, можно узнать, сколько памяти расходуется при использовании разных образцов кода.

    4. Оптимизация генерируемого кода.
    По умолчанию компилятор Pawn никак не оптимизирует генерируемый код.
    Однако, в ситуациях, когда требуется оценить производительность кода, оптимизации иногда могут изменить результаты тестов. Кроме того, код после оптимизации, как правило, более компактный и его легче разбирать в ассемблерных листингах.
    За оптимизацию генерируемых инструкций в компиляторе отвечает ключ -OX:
    -O0 - никаких оптимизаций.
    -O1 - JIT-совместимые оптимизации.
    -O2 - то же самое, что в -O1, но также используются оптимизации, не совместимые с JIT.
    Код, скомпилированный с ключом -O2 не запустится, если использовать плагин JIT для SA:MP, поэтому целесообразно указывать в pawn.cfg ключ -O1.

    5. Удаление отладочной информации.
    Ключ компилятора -dX отвечает за добавление отладочной информации:
    -d0 - не добавлять отладочной информации.
    -d1 - проверки времени выполнения (например, проверки на выход за пределы массивов).
    -d2 - проверки времени выполнения с символьной информацией (названия функций и переменных).
    -d3 - то же самое, что и -d2, но также отключает оптимизацию генерируемого кода (-O0).
    Указав в pawn.cfg ключ -d0, можно убрать из кода лишние инструкции (break, bounds), что опять же может быть полезно при чтении дизассемблерных листингов.


    Тема будет пополняться.
    А в какой литературе объясняют подобные вещи? От куда вы это знаете?

  7. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Unreal Посмотреть сообщение
    можно по подробнее, я использую JIT plugin, т.е если я и это "поставлю", то будет еще лучше ?
    По умолчанию компилятор уже оптимизирует байткод (-O1), поэтому есть смысл либо применять оптимизации, не совместимые с JIT (-O2), либо вообще отключать оптимизацию (-O0).


    Цитата Сообщение от Kladvey Посмотреть сообщение
    А в какой литературе объясняют подобные вещи? От куда вы это знаете?
    Собственные наблюдения. И кто учил вас цитировать такие огромные посты ради всего одной строки в ответе? Листать неудобно же -_-
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. 2 пользователя(ей) сказали cпасибо:
    Unreal (11.10.2015) Тузик (11.11.2016)
  9. #7
    Аватар для Boulevard_Picard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2018
    Сообщений
    13
    Репутация:
    0 ±
    Как использовать утилиту pawndisasm? Можно поподробнее

  10. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Boulevard_Picard Посмотреть сообщение
    Как использовать утилиту pawndisasm? Можно поподробнее
    Как и многие другие консольные утилиты: сначала запустить без параметров и в ответ получить ответ с синтаксисом использования
    Usage: pawndisasm <input> [output]
    а затем использовать согласно этому синтаксису. Пример: "pawndisasm myscript.amx myscript.asm".
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. Пользователь сказал cпасибо:
    Boulevard_Picard (11.07.2018)
  12. #9
    Аватар для Paradox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    Daniel_Cortez, лучший, сегодня только думал об этом и хотел уже создать вопрос, спасибо большое!

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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