PDA

Просмотр полной версии : [Урок] Мифы о Pawn-скриптинге - #1



Daniel_Cortez
10.10.2015, 23:08
Внимание: данная тема закрыта для защиты от копирования.
Если есть какие-то вопросы, замечания или просто пожелания по поводу данного урока - оставляйте их здесь (http://pro-pawn.ru/showthread.php?12774-%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5).




Миф 1: "Весь код лучше записывать в одну строку, так оптимизированнее!"

Статус: Опровергнут.

Описание:

Многие нубы не осознают, что интерпретатор Pawn выполняет код не из исходника (*.pwn, *.p), а из скомпилированного файла (*.amx), в котором всё представлено в совершенно ином виде. Равно, как и не понимают вообще разницы между исходным кодом и скомпилированным.
А потому им кажется логичным, что если исходный код записывать как можно короче, то кода будет меньше и он будет быстрее выполняться.


Доказательство:

Сначала создадим файл с каким-нибудь кодом на Pawn (для примера возьмём нахождение факториала):
Файл: test1_1.pwn

#include <a_samp>

Fact(x)
{
if(x < 0) // Мог бы использовать assert, но он не работает в SA:MP.
{
return 0;
}
if(x < 2)
{
return 1;
}
new result = 2;
while(x != 2)
{
result *= x--;
}
return result;
}

main()
{
printf("%d\n", Fact(1));
}


Затем сделаем копию файла и в ней постараемся "утрамбовать" весь код: сократим имена функций/переменных до одного символа и уберём все необязательные пробелы, операторные скобки {} и переносы строк.
Одним словом, сделаем кашу из утрамбованного говнокода - прямо как любят RLS'ники.
Файл: test1_2.pwn

#include <a_samp>
F(x){if(x<0)return 0;if(x<2)return 1;new r=2;while(x!=2)r*=x--;return r;}main()printf("%d\n", F(1));


Скомпилируем оба файла с ключами "-d0 -v2".
Первый ключ нужен для того, чтобы убрать из кода отладочную информацию - таким образом, его будет проще читать в ассемблерных листингах.
Второй нужен, чтобы компилятор вывел подробную информацию о требованиях скрипта к памяти.
Результаты компиляции test1_1.pwn:


Pawn compiler 3.10.20150531 Copyright (c) 1997-2006, ITB CompuPhase

Header size: 116 bytes
Code size: 276 bytes
Data size: 16 bytes
Stack/heap size: 16384 bytes; estimated max. usage=12 cells (48 bytes)
Total requirements: 16792 bytes

Done.

Результаты компиляции test1_2.pwn:


Pawn compiler 3.10.20150531 Copyright (c) 1997-2006, ITB CompuPhase

Header size: 116 bytes
Code size: 276 bytes
Data size: 16 bytes
Stack/heap size: 16384 bytes; estimated max. usage=12 cells (48 bytes)
Total requirements: 16792 bytes

Done.

Как видно, размер кода одинаковый (строка "Code size"). Размеры заголовка AMX (header size), данных (data size) и стека/кучи (stack/heap size) тоже совпадают.
Размеры файлов тоже одинаковые.
Сравним сгенерированный код в обоих файлах AMX, воспользовавшись утилитой pawndisasm:
Файл test1_1.lst


;File version: 8
;Flags: compact-encoding

00000000 halt 00000000

00000008 proc
0000000c break
00000010 load.s.pri 0000000c
00000018 move.alt
0000001c zero.pri
00000020 jsleq 00000034
00000028 break
0000002c zero.pri
00000030 retn
00000034 break
00000038 load.s.pri 0000000c
00000040 const.alt 00000002
00000048 jsgeq 00000060
00000050 break
00000054 const.pri 00000001
0000005c retn
00000060 break
00000064 push.c 00000002
0000006c break
00000070 break
00000074 load.s.pri 0000000c
0000007c const.alt 00000002
00000084 jeq 000000c4
0000008c break
00000090 load.s.pri fffffffc
00000098 push.pri
0000009c load.s.pri 0000000c
000000a4 dec.s 0000000c
000000ac pop.alt
000000b0 smul
000000b4 stor.s.pri fffffffc
000000bc jump 00000070
000000c4 break
000000c8 load.s.pri fffffffc
000000d0 stack 00000004
000000d8 retn

000000dc proc
000000e0 break
000000e4 push.c 00000001
000000ec push.c 00000004
000000f4 call 00000008
000000fc heap 00000004
00000104 stor.i
00000108 push.alt
0000010c push.c 00000000
00000114 push.c 00000008
0000011c sysreq.c 00000000 ; printf
00000124 stack 0000000c
0000012c heap fffffffc
00000134 zero.pri
00000138 retn


;DATA
00000000 00000025 00000064 0000000a 00000000 % d


Файл test1_2.lst


;File version: 8
;Flags: compact-encoding

00000000 halt 00000000

00000008 proc
0000000c break
00000010 load.s.pri 0000000c
00000018 move.alt
0000001c zero.pri
00000020 jsleq 00000034
00000028 break
0000002c zero.pri
00000030 retn
00000034 break
00000038 load.s.pri 0000000c
00000040 const.alt 00000002
00000048 jsgeq 00000060
00000050 break
00000054 const.pri 00000001
0000005c retn
00000060 break
00000064 push.c 00000002
0000006c break
00000070 break
00000074 load.s.pri 0000000c
0000007c const.alt 00000002
00000084 jeq 000000c4
0000008c break
00000090 load.s.pri fffffffc
00000098 push.pri
0000009c load.s.pri 0000000c
000000a4 dec.s 0000000c
000000ac pop.alt
000000b0 smul
000000b4 stor.s.pri fffffffc
000000bc jump 00000070
000000c4 break
000000c8 load.s.pri fffffffc
000000d0 stack 00000004
000000d8 retn

000000dc proc
000000e0 break
000000e4 push.c 00000001
000000ec push.c 00000004
000000f4 call 00000008
000000fc heap 00000004
00000104 stor.i
00000108 push.alt
0000010c push.c 00000000
00000114 push.c 00000008
0000011c sysreq.c 00000000 ; printf
00000124 stack 0000000c
0000012c heap fffffffc
00000134 zero.pri
00000138 retn


;DATA
00000000 00000025 00000064 0000000a 00000000 % d

Абсолютно никаких отличий. Оба файла *.amx совпадают байт-в-байт.


Вывод: сокращение количества строк в исходном коде, стирание пробелов и укорачивание имён переменных и функций не ведёт ни к каким изменениям в скомпилированном коде (AMX).
Максимум может уменьшиться объём отладочных данных, если указать ключ "-d3" в файле pawn.cfg.
Самому же интерпретатору не нужны имена объектов в AMX, т.к. он обращается к ним не по именам, а по их виртуальным адресам.



Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Не разрешается копирование данной статьи на других ресурсах без разрешения автора.

gangzone.ini
10.10.2015, 23:53
Надо скинуть эту тему Томасу Макавели :sarcastic:

jeraqiv
11.10.2015, 00:51
Скомпилируем оба файла с ключами "-d0 -v2"

Как скомпилировать с ключами? Что прописал и как реализовать?

Daniel_Cortez
11.10.2015, 00:56
Как скомпилировать с ключами? Что прописал и как реализовать?
http://pro-pawn.ru/showthread.php?12725

wAx
11.10.2015, 12:08
Весьма очевидный миф... ну в целом не плохо для старта =)

Disinterpreter
11.10.2015, 12:10
Ждем более интересных опровержений