PDA

Просмотр полной версии : [Урок] Таинственная нагрузка и оптимизация кода ради пары миллисекунд



underwoker
17.06.2014, 02:00
Всем привет. Я бы хотел обсудить с вами тему оптимизирования кода и мистической всеубивающей нагрузки, которой все так бояться.
Хочу заметить сразу. Я не считаю себя профессионалом pawn. Есть много людей, которые знают о pawn в разы больше меня. Так что всё, что я буду писать ниже, будет являться моим скромным мнением.

Первая тема:
Как и большинство скриптеров, я частенько почитываю форумы, ища для себя какую-то интересную информацию. И я очень часто стал замечать сообщения, типа "Не используй то-то, ибо это нагрузка на сервер!". Меня довольно сильно стал напрягать этот вопрос, ибо часто люди обращаются ко мне в скайп за помощью и периодически я слышу "...но это же нагрузка на сервер!...". И самое главное то, что такие люди, по незнанию, ограничивают себя во многом, боясь мистической нагрузки. По моему, времена, когда нужно было бояться любой лишней нагрузки и когда надо было считать каждый килобайт использованной памяти, давно прошли и сейчас компьютеры способны на гораздо большее, чем "обновление текстдрава каждую секунду". Лично мне ещё ни разу не удавалось положить свой сервер мистической нагрузкой. Кривым кодом - да. Но вот нагрузкой ни разу. И мне хочется плакать от смеха, когда читаешь в темах что-то типа: "Не используйте паблик OnPlayerUpdate!!!! Нельзя!!! Нагрузка, ололо!!!!". Я бы лично оторвал людям, которые пишут подобные сообщения, руки и засунул их в одно место...
Я лишь хочу сказать то, что, по моему, нужно бояться не нагрузки, а кривого кода. Ибо если код построен правильно, вся нагрузка будет незаметна (выделил память - использовал - отчистил. И не нужно бояться нагрузки). Именно кривой код кладёт сервера (код, создающий рекурсию, например), а не нагрузка от обновления чего-либо.
Если я не прав, хотелось бы услышать аргументированный ответ =)

Вторая тема:
Так же очень часто стал замечать мега-уроки, в которых люди помогают оптимизировать код. Нет, против оптимизации я ничего не имею и даже поддерживаю эту тему (часто именно по теме оптимизации ищу новую информацию). Я против того, что пишут в этих самых уроках. А пишут там частенько подобное:
"Добрый день. Бла-бла-бла. Сегодня я вам покажу как оптимизировать "бла-бла". Это очень просто. Берёте "бла" и заменяете на мою функцию - "алб". Всё. И помните, использовать "бла-бла" плохо! Это очень нагружает мод! Мой способ ускоряет функцию на целых пару миллисекунд!"
Примерно так. То есть, часто читаешь уроки и понимаешь, что автор пытается сказать "Использовать стандартные функции - плохо". Примерно такая тема была про PVar. Какой-то парень утверждал, что если использовать обычные массивы new, а не PVar, значит можно быть уверенным, что твой мод будет лагать и т.д. Я, если честно, не очень помню всего того, что он писал. Но писал он полную ересь. И таких людей очень много. Я называю их жертвами оптимизации. Именно от таких людей я слышал не раз "Используешь старую функцию, а не новую? Нуб!" (Один парень задал вопрос на форуме и я ему написал готовый код с использованием if/else, а не switch/case. И тут же прибежал какой-то парень, крича то, что я нуб и надо использовать switch/case, ведь нагрузки меньше!!!!). В общем, я хочу сказать, что очень глупо бегать за миллисекундами. Ни один игрок не оценит вашего старания. Да и вы сами не увидите никакой разницы. И если вы не можете разобраться в каком-то новомодном способе, ускоряющем работу кода на целые ПАРУ МИЛЛИСЕКУНД, просто пользуйтесь старым, проверенным способом. Помните, что раньше не было никаких "switch/case", "pVar" и прочего, но сервера спокойно работали, держа в паблике OnPlayerUpdate целые системы, которые не заставляли лагать сервер. Просто стройте свой код логически и тогда всё будет хорошо. Повторюсь, сервера падают не от нагрузки, а исключительно от кривого кода.

Я бы хотел услышать ваше мнение по этому поводу. Писал тему на ходу + уставший, поэтому мысли могут быть немного не связаны между собой Только прошу аргументировать свои ответы =)

**********************************************************************************************************
P.s. Выложил сюда т.к. когда то он мне этой темой очень помог, а сейчас наш раздел "Вопросы" забит вопросами о оптимизации. И думаю эта тема не будет лишней.

Текст писал: DeIMoS
Скопировал и вставил сюда: underwoker
Над сценарием работал: DeIMoS
Дата выкладывания на Г-И: 16.06.2013, 16:43(Годовщина блин)

Дёня
24.06.2014, 22:27
Ну просто шикарно. А я раньше думал совсем наоборот :)

Спасибо тебе DaIMoS за данную тему, особенно про OnPlayerUpdate, я старался самый минимум кода использовать в этом паблике.

И тебе спасибо underwoker, за то, что скопировал и вставил сюда эту тему(статью :D) :victory:

DeimoS
24.06.2014, 22:52
По поводу OnPlayerUpdate вообще много разных сказок до нашего времени дошло. При том точно так же, как рассказы передавали от отца к сыну на Руси, опуская некоторые детали предыдущего рассказчика и добавляя отсебятину.
Я лишь скажу следующее. Естественно, вставлять в OnPlauerUpdate, например, проверку на деньги игрока как-то глупо, ибо деньги - штука, которая обновляется исключительно сервером и на сервере, поэтому и проверять можно при обновлении, а не по 10 раз за секунду. Но если ваша система требует точных данных - ничего плохого в использовании OnPlayerUpdate не будет. Но и про оптимизацию в этом коллбэке забывать не стоит. В данном случае позволительна даже пессимизация в плане читаемости кода, ибо чем быстрее машина прожуёт и проглотит ваш код, тем ей же и лучше (ведь вызываться код будет часто). В общем, опять же, упор идёт на адекватно написанный код. Если он таков - о нагрузке особо беспокоиться не стоит


А статья немного упоротая :) Точнее я был немного упорот, когда создавал ту тему.

OKStyle
24.06.2014, 22:59
Именно кривой код кладёт сервера (код, создающий рекурсию, например), а не нагрузка от обновления чего-либо.

if(strcmp(cmdtext, "/enter1", true) == 0) return OnPlayerCommandText(playerid, "/enter2");
Примерно такой код тоже даст рекурсию. Нагрузки тут нет. Рекурсия губит - этот тезис из тех же глупых уст, что и нагрузка в OnPlayerUpdate.

Я вообще приверженец старой школы, для меня важна работоспособность, а не оптимизация. При правильном распределении "нагрузки" по пабликам всё будет работать как часы.

DeimoS
25.06.2014, 01:14
Я вообще приверженец старой школы, для меня важна работоспособность, а не оптимизация. При правильном распределении "нагрузки" по пабликам всё будет работать как часы.

Вот именно это я и пытался передать всей этой писаниной. :declare:

Zeror_Dalglish
26.06.2014, 11:26
Вот именно это я и пытался передать всей этой писаниной. :declare:

OnPlayerUpdate хорошо использовать по систему AFK.

Вот только я не помню скок раз в секунды он срабатывает?

DeimoS
26.06.2014, 11:28
OnPlayerUpdate хорошо использовать по систему AFK.

Вот только я не помню скок раз в секунды он срабатывает?

http://pro-pawn.ru/showthread.php?9172-OnPlayerUpdate-%D0%9F%D1%80%D0%B0%D0%B2%D0%B4%D0%B0-%D0%BB%D0%B8-%D0%BE%D0%BD-%D1%87%D0%B0%D1%81%D1%82%D0%BE-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F

Zeror_Dalglish
26.06.2014, 11:30
http://pro-pawn.ru/showthread.php?9172-OnPlayerUpdate-%D0%9F%D1%80%D0%B0%D0%B2%D0%B4%D0%B0-%D0%BB%D0%B8-%D0%BE%D0%BD-%D1%87%D0%B0%D1%81%D1%82%D0%BE-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D1%8F%D0%B5%D1%82%D1%81%D1%8F

А вот, точно сколько нет?
То 20, то 8 :)

DeimoS
26.06.2014, 11:33
А вот, точно сколько нет?
То 20, то 8 :)

Зависит от действий игрока на сервере. Чем больше действий надо синхронизировать, тем больше пакетов будет отправлено на сервер и тем чаще будет вызываться OnPlauerUpdate. А частота этих самых запросов на синхронизацию зависит от настроек в server.cfg

Zeror_Dalglish
26.06.2014, 11:33
Зависит от действий игрока на сервере. Чем больше действий надо синхронизировать, тем больше пакетов будет отправлено на сервер и тем чаще будет вызываться OnPlauerUpdate. А частота этих самых запросов на синхронизацию зависит от настроек в server.cfg

Отлично, спасибо :)