PDA

Просмотр полной версии : [Вопрос] Проверка из dc_kickfix



Paradox
29.01.2021, 16:56
Доброго времени суток, в общем в inc dc_kickfix заметил такую вот проверку..


if(0 == IsPlayerConnected(playerid))
return 0;


И почему не написать так:


if(!IsPlayerConnected(playerid))
return 0;


в общем в чем разница и почему ровняется именно нулю?

20th century
29.01.2021, 19:31
Разницы никакой нет, проверка в обоих случаях одинакова. Скорее у автора свой стиль написания кода.

Paradox
29.01.2021, 20:10
Разницы никакой нет, проверка в обоих случаях одинакова. Скорее у автора свой стиль написания кода.

Понял, спасибо большое

tnc
30.01.2021, 04:38
есть небольшая разница, если вызывать отрицания, то генерируется на одну инструкцию больше:



// отрицание
load.s.pri fffffffc
not
jzer 0

// простое сравнение с нулем
load.s.pri fffffffc
jnz 0


а, равняется нулю, потому что проверка идет на не подключенного игрока

Paradox
30.01.2021, 17:15
есть небольшая разница, если вызывать отрицания, то генерируется на одну инструкцию больше:



// отрицание
load.s.pri fffffffc
not
jzer 0

// простое сравнение с нулем
load.s.pri fffffffc
jnz 0


а, равняется нулю, потому что проверка идет на не подключенного игрока

Спасибо за ответ, а как можно проверять подобный код, есть мануал?

20th century
30.01.2021, 19:25
В pawn.cfg добавить ключ -a и скомпилировать .pwn. В папке появится файл с расширением .asm.

Daniel_Cortez
31.01.2021, 13:01
Спасибо за ответ, а как можно проверять подобный код, есть мануал?
Если об этом и есть какие-то материалы на форумах, то разве что самые минимальные, и это не просто так.


В pawn.cfg добавить ключ -a и скомпилировать .pwn. В папке появится файл с расширением .asm.
Вот только нельзя судить о производительности кода по одному лишь количеству инструкций, есть и другие факторы (например, наличие лишних переходов, которых можно избежать, даже если ценой большего числа инструкций).

Это микрооптимизации, которые, во-первых, требуют специфических знаний, и, во-вторых, обычно идут в ущерб читаемости кода. Для их применения нужно иметь базовые представления о внутреннем устройстве интерпретатора (или об архитектуре ЭВМ, ибо интерпретатор AMX - по сути тот же "виртуальный" процессор, максимально приближенный к реальной архитектуре).
То есть, если, к примеру, есть большое желание сделать что-нибудь необычное, чего нельзя реализовать на простом Pawn (например, как в switchrand() (https://pro-pawn.ru/showthread.php?16996-random_switch-inc)) и до этого вы проходили архитектуру ЭВМ в вузе или технаре - возможно, есть смысл изучить встроенный ассемблер Pawn. Если же нужно просто сэкономить пару инструкций там и тут - это пустая трата времени, на практике разница будет заметна только если код выполняется в цикле на несколько сотен или даже тысяч итераций. Собственно, я использую микрооптимизации в своих инклудах только потому, что делаю эти инклуды не только для себя, но и для других, а потому хочу чтобы мой код добавлял как можно меньше накладных расходов к пользовательскому коду. Естественно, в коде, не предназначенном для паблика, я не стану тратить время на что-то подобное.