Daniel_Cortez
09.10.2015, 21:40
В данной статье приведены методы, которые будут использоваться в доказательствах в предстоящем цикле уроков по скриптингу (http://pro-pawn.ru/showthread.php?12680).
Отдельная тема нужна для того, чтобы не засорять пояснениями другие статьи и при этом развёрнуто описать каждый из приёмов.
Касаемо 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.
https://github.com/Zeex/pawn
Благодаря этому приёму можно узнать, во что превратится исходный код после компиляции и судить о целесообразности тех или иных оптимизационных приёмов.
2. Профилирование.
Профилирование (в информатике) (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29) - сбор характеристик работы программы.
Не так давно я выкладывал профайлер (http://pro-pawn.ru/showthread.php?12585) для измерения времени выполнения двух отрывков кода на 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 (http://www.pro-pawn.ru)
Не разрешается копирование данной статьи на других ресурсах без разрешения автора.
Отдельная тема нужна для того, чтобы не засорять пояснениями другие статьи и при этом развёрнуто описать каждый из приёмов.
Касаемо 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.
https://github.com/Zeex/pawn
Благодаря этому приёму можно узнать, во что превратится исходный код после компиляции и судить о целесообразности тех или иных оптимизационных приёмов.
2. Профилирование.
Профилирование (в информатике) (https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29) - сбор характеристик работы программы.
Не так давно я выкладывал профайлер (http://pro-pawn.ru/showthread.php?12585) для измерения времени выполнения двух отрывков кода на 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 (http://www.pro-pawn.ru)
Не разрешается копирование данной статьи на других ресурсах без разрешения автора.