Оптимизация кода

Привет. Вот я задумался по поводу быстродействия функций и макросов. Недавно мне предложили заменить функцию
pawn Код:
GetSpeed(Float:vX, Float:vY, Float:vZ) return floatround(VectorSize(vX, vY, vZ) * 179.28625);
Макросом
pawn Код:
#define GetSpeed(%0,%1,%2) floatround(VectorSize(%0, %1, %2) * 179.28625)
Аргументировав это тем, что на вызов функции нужно хоть малое, но время. По началу я особо и не задумался, а взял и заменил. Но вот сейчас мне кажется немного не правильной эта точка зрения, ведь если например я 50 раз использую макрос, в итоге это будет 50 раз повторяющийся один и тот же код.
А вот насчёт функций мне так не кажется. Если я прав, то эта функция просто вызовется 50 раз, а код будет написан только в 1 месте.. и это как-бы должно быть лучше.

Хотя с другой стороны моя функция ничего толком и не делает, кроме как вызывает пару других и умножает полученное число, и никаких больших условий в ней нет.

Так собственно вопрос: что было бы лучше в данной ситуации, и в каких лучше одно, а в каких другое, либо же что из этого использовать не нужно вообще?
Reply

Последовательность вызовов через stock:
Function->GetSpeed->floatround

Последовательность вызовов через #define:
Function->floatround

В первом случае у тебя будет прослойка, лишний вызов функции, соответственно лишние инструкции. Лишние инструкции обрабатываются и теряется процессорное время, но это не смертельно и жить можно как с ещё одним новым волоском бороды.
Reply

Можно вообще обойтись без своих функций, но удобно ли это?
Reply

Quote:
Originally Posted by xJester
Посмотреть сообщение
Можно вообще обойтись без своих функций, но удобно ли это?
Можно, но это вам надо? Функции упрощают нам жизнь и отказываться от них - все равно, что выстрелить себе в ногу! К примеру, native функции быстрее Pawn кода, одну функцию можно использовать много раз и не писать одно и то же. Используя самописные функции, мы экономим не только время при скриптинге, но и ресурсы. Это их малая особенность =)
Reply

Хах.. Заметил в логе такие строки:
Код:
[18:42:35] [jit] Invalid or unsupported instruction at address 00003f20:
[18:42:35] [jit]   => jrel 0
Что это могло бы значить?

P.s. jit-плагин подключается раньше остальных:
Код:
jit streamer mysql
P.s.s. При спавне теперь не крашит, но всё же эти две строчки не могут быть просто так (что за адрес 00003f20 ?).

UPD. И еще.. разве jit несовместим с crashdetect?
Reply

Quote:
Originally Posted by ea8de1
Посмотреть сообщение
Хах.. Заметил в логе такие строки:
Код:
[18:42:35] [jit] Invalid or unsupported instruction at address 00003f20:
[18:42:35] [jit]   => jrel 0
Что это могло бы значить?
Возможно отсутствует поддержка инструкций процессором, либо самим jit.
Резонно попробовать подключить плагин в конце и проверить.

Quote:
Originally Posted by ea8de1
Посмотреть сообщение
UPD. И еще.. разве jit несовместим с crashdetect?
Код преобразуется и crashdetect теряется.
Reply

Quote:
Originally Posted by White_116
Посмотреть сообщение
Возможно отсутствует поддержка инструкций процессором, либо самим jit.
Резонно попробовать подключить плагин в конце и проверить.
Попробовал и в конце, и посередке) все равно выводит эти 2 строчки в лог, как на винде так и на линуксе (vps).
Может кто-нибудь еще с этим сталкивался?

UPD. jit.inc подключен после a_samp.inc. Хотя скорее всего это не имеет значения...
Reply

jit.inc вообще подключать не надо, если не собираешься пользоваться теми функциями. С crashdetect совместимы только конкретные версии. Я писал исследования по этому поводу - погугли.
Reply

Убрал jit.inc, но те два сообщения всё равно выводятся. А так пока что вроде всё нормально
Reply

Есть такой примерчик:
pawn Код:
#undef MAX_PLAYERS
#define MAX_PLAYERS (20)

new pk_num_current[MAX_PLAYERS char]; //20 байт
new bool:pk_stand[MAX_PLAYERS char]; //20 байт

new pk_num_current[MAX_PLAYERS]; //80 байт
Дело обстоит так, что я могу обойтись одной переменной, но выходит, что выгодней использовать две переменные, которые в памяти будут хранить по 20 байт (итого: 40 байт), правильно понимаю?
Reply

Подскажите, что из основного нагружает процессор, а что оперативку? Мой сервер при онлайне 350 игроков, неимоверно использует процессор (2.4 ГГц) на полную катушку, при этом потребление оперативной памяти варьируется в пределах разумного (~500 мб).

Код достаточно чистый и оптимизированный. Нет глупых ошибок, которые мог бы допустить новичок, когда он не понимает что делает, к примеру создав хорошую нагрузку каким-нибудь не правильным использованием цикла с сохранением всех данных по 100500 раз. Задействовал Jit и foreach. Дало свои плоды, но ситуацию не исправило.
Reply

Quote:
Originally Posted by x_O
Посмотреть сообщение
Подскажите, что из основного нагружает процессор, а что оперативку? Мой сервер при онлайне 350 игроков, неимоверно использует процессор (2.4 ГГц) на полную катушку, при этом потребление оперативной памяти варьируется в пределах разумного (~500 мб).

Код достаточно чистый и оптимизированный. Нет глупых ошибок, которые мог бы допустить новичок, когда он не понимает что делает, к примеру создав хорошую нагрузку каким-нибудь не правильным использованием цикла с сохранением всех данных по 100500 раз. Задействовал Jit и foreach. Дало свои плоды, но ситуацию не исправило.
Процессор используют арифметика, плагины и алгоритмы.
Память выделяется только под созданные переменные.
Reply

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Процессор используют арифметика, плагины и алгоритмы.
Память выделяется только под созданные переменные.
В таком случае возможно ли, что львиную долю нагрузки на процессор дает Streamer от Инкогнито? Использую достаточно много объектов, иконок и прочее. Однако все запредельные нагрузки исключительно при высоком онлайне.
Reply

Quote:
Originally Posted by x_O
Посмотреть сообщение
В таком случае возможно ли, что львиную долю нагрузки на процессор дает Streamer от Инкогнито? Использую достаточно много объектов, иконок и прочее. Однако все запредельные нагрузки исключительно при высоком онлайне.
Может.
Reply

Quote:
Originally Posted by x_O
Посмотреть сообщение
В таком случае возможно ли, что львиную долю нагрузки на процессор дает Streamer от Инкогнито? Использую достаточно много объектов, иконок и прочее. Однако все запредельные нагрузки исключительно при высоком онлайне.
На сколько много объектов? При 50 тысячях не заметил сильной нагрузки.
Reply

Quote:
Originally Posted by x_O
Посмотреть сообщение
В таком случае возможно ли, что львиную долю нагрузки на процессор дает Streamer от Инкогнито? Использую достаточно много объектов, иконок и прочее. Однако все запредельные нагрузки исключительно при высоком онлайне.
На данный момент более 100 тысяч. Особых проблем не обнаружено. Хотя поговаривают, что проблемы есть при использовании объектов в виртуальных мирах.
Reply

Сортировка стримера.
Вычисления в циклах.
Постоянные вычисления при обновлении игрока.

Сделай профилирование.
Reply

Quote:
Originally Posted by x_O
Посмотреть сообщение
В таком случае возможно ли, что львиную долю нагрузки на процессор дает Streamer от Инкогнито? Использую достаточно много объектов, иконок и прочее. Однако все запредельные нагрузки исключительно при высоком онлайне.
Сколько объектов ? И сколько в разных мирах ?

Quote:
Originally Posted by Kolstin
Посмотреть сообщение
На сколько много объектов? При 50 тысячях не заметил сильной нагрузки.
Плагин по дефолту настроен ?
Reply

Объектов 5000. По сравнению с вашими цифрами, это конечно капля воды в море. Все объекты установлены по дефолту в виртуальных мирах и интерьерах (-1). Плагин настроен по стандарту.

Делаю профилирование, но оно не помогает выявить проблемное место, об это я написал в соседней теме: http://forum.sa-mp.com/showpost.php?...7&postcount=38

Про foreach: какой лучше использовать? Этот https://sampforum.blast.hk/showthread.php?tid=570868 или этот http://pastebin.com/s7PNAXZt и какие используете вы?
Reply

Quote:
Originally Posted by x_O
Посмотреть сообщение
Объектов 5000. По сравнению с вашими цифрами, это конечно капля воды в море. Все объекты установлены по дефолту в виртуальных мирах и интерьерах (-1). Плагин настроен по стандарту.

Делаю профилирование, но оно не помогает выявить проблемное место, об это я написал в соседней теме: http://forum.sa-mp.com/showpost.php?...7&postcount=38

Про foreach: какой лучше использовать? Этот https://sampforum.blast.hk/showthread.php?tid=570868 или этот http://pastebin.com/s7PNAXZt и какие используете вы?
У тебя паблики fresh и speed нагрузку дают. Ну возможно нагрузка из за записей в файл. Такое может быть из за медленного винта.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)