Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Улучшение производительности кода - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

  • (9 Страниц) +
  • 1
  • 2
  • 3
  • 4
  • 5
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Улучшение производительности кода Различные способы
Оценка: -----

#21
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNexius (10 Сентябрь 2016 - 16:50) писал:

Думать обычно учат в школе, ну или дефектологи, если уж совсем крайний случай.


Ты явно слабо знаком с образовательной системой в СНГ, раз говоришь, что в школах учат думать. В школах дают готовую информацию и заставляют её заучивать. От того большинство людей не могут найти решение элементарной проблемы и сразу бегут на форумы, задавать вопросы. И в институтах многие теряются, ибо там им уже не разжевывают всю информацию, а дают лишь основы, которые должны тех натолкнуть на правильный путь.

Просмотр сообщенияNexius (10 Сентябрь 2016 - 16:50) писал:

Да и каким тогда веником человека, не умеющего думать, заносит в скриптинг?


Лол, ты серьёзно? Можем вместе пройтись по форумам и посмотреть каких людей заносит в скриптинг.

Просмотр сообщенияNexius (10 Сентябрь 2016 - 16:50) писал:

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


Если я расскажу тебе о том, как я проехал сегодня от дома до работы, ты научишься водить автомобиль? Или если инженер расскажет тебе о том, как он строил дом, сможешь ли ты построить такой же дом?


Просмотр сообщенияNexius (10 Сентябрь 2016 - 16:50) писал:

С такой логикой любые темы по оптимизации имеют малую полезность.

Именно. Оптимизации нельзя научить конкретными примерами. Нужно понимать то, что ты пишешь и знать как компьютер будет обрабатывать твой код, прежде чем браться за оптимизацию
Например [Показать]

Да и вообще, реальная оптимизация, которая ускорит выполнение кода, заключается не в пропуске инициализации массивов, а в переработке кода систем, в которых код построен без какой-либо логики. И тут нужно либо давать готовые решения, не пытаясь это выдавать за какие-либо уроки, либо пытаться объяснять почему нужно делать именно так, а не иначе (что будет мало толку приносить, судя по уровню усвоения информации у многих людей).

В общем, я хочу сказать, что вы не с тем пытаетесь бороться. Вы боритесь с результатом говнокодерства, а не учите людей не говнокодить. Поэтому эта тема не имеет в себе никакого смысла. Научите людей понимать логику работы кода и они изначально начнут писать скрипты, которые не нуждаются в оптимизации.

Просмотр сообщенияNexius (10 Сентябрь 2016 - 16:50) писал:

Да, спасибо, мы поняли.

Всегда пожалуйста :cool:



Просмотр сообщенияSound (10 Сентябрь 2016 - 19:25) писал:

Взять пример с индивидуальных таймеров:


Ну да, отличный пример в виде какого-то сомнительного сервера, который, возможно, существовал. Ты знаешь какой был мод у этого сервера? Знаешь что там был за код, хотя бы, в таймерах, не говоря уже о остальном моде? Это как если я начну сейчас говорить, что инопланетяне существуют, ведь я их видел и мы даже с ними вместе на летающей тарелке летали. В таких ситуациях эта гифка напрашивается сама собой:
https://vk.com/doc36...6a161cd11a54b99

Я не говорю, что способ с использованием индивидуальных таймеров не избавит от проблемы с зависанием (избавит. Благодаря тому, что нагрузка будет распределена на больший промежуток времени, а не на какой-то конкретный его промежуток, как было с таймерами). Но все забывают, что у любой оптимизации есть обратная сторона. И в данном случае это нагрузка на оперативную память, в которой все эти индивидуальные таймеры будут хранится. Хотя можно просто оптимизировать код внутри цикла и избавится от лагов (а ещё лучше - оптимизировать код и разбить его на индивидуальные таймеры).
То бишь, подобный подход - это попытка обойти проблему очередным костылём, а не исправить её.

Просмотр сообщенияSound (10 Сентябрь 2016 - 19:25) писал:

Да и вообще, если связывать всё больше и больше способов улучшить работу скрипта - это всё выйдет во вкусную конфетку. А закрывая глаза - наоборот выявит грыжу, возможно даже не большую, но грыжу.


Скрипт изначально нужно писать оптимизированно, строя код максимально логично. Тогда и никакие методы оптимизации не нужны будут. Когда люди это поймут - всем на Земле станет чуточку лучше. Ну или в SA-MP, как минимум.

Просмотр сообщенияSound (10 Сентябрь 2016 - 19:25) писал:

Тем более, если не нравиться эта тема - почитай ссылку на статью от Y_LESS. И там встречаются моменты с этой темы, а уж поверь, ему доверяться многие, нежели человеку, который на факты отвечает - "имхо".


Во-первых, y_less такой же человек, как и мы с тобой. И его мнение не является 100% верным. Он такой же самоучка (о чём сам писал), и так же может ошибаться.
Во-вторых, советую тебе самому более подробно ознакомиться с его статьёй и понять, что там он рассказывает не о конкретных сомнительных примерах оптимизации, а о том, как не нужно делать и почему так не нужно делать, показывая правильное решение. Он объясняет людям суть ошибок, которые они могут допустить, чтоб те в будущем могли сами находить в своём коде эти ошибки. Примеры в его коде лишь подкрепляют теоретическую часть, а не являются основой. Вот в чём разница его темы и этой.

Просмотр сообщенияSound (10 Сентябрь 2016 - 19:25) писал:

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


Я лишь выражаю своё мнение. То, что оно не совпадает с вашим - вполне нормальное явление. То, что я его отстаиваю - тоже.
Во-первых, форум для того и создан, чтоб общаться (в том числе и обмениваться мнениями).
Во-вторых, в споре рождается истина (вы узнаёте мою точку зрения. Я - вашу. Каждый из нас может почерпнуть для себя что-то новое. Это плохо? Я не думаю).

И забавно, что большая часть русского комьюнити воспринимает любую критику как какое-то высокомерие или что-то подобное. Ваше мнение не всегда единственно верное - добро пожаловать в реальный мир :wink:

Сообщение отредактировал DeimoS: 11 Сентябрь 2016 - 00:30

0

#22
Пользователь офлайн   krutoy.krosch 

  • Banned
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Лол, ты серьёзно? Можем вместе пройтись по форумам и посмотреть каких людей заносит в скриптинг.


лучше это не надо

#23
Пользователь офлайн   Nexius 

  • Знаток
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Ты явно слабо знаком с образовательной системой в СНГ, раз говоришь, что в школах учат думать. В школах дают готовую информацию и заставляют её заучивать. От того большинство людей не могут найти решение элементарной проблемы и сразу бегут на форумы, задавать вопросы. И в институтах многие теряются, ибо там им уже не разжевывают всю информацию, а дают лишь основы, которые должны тех натолкнуть на правильный путь.

Так в том то и смысл, что это форум павн-скриптинга, а не бюро, которое наталкивает на правильные пути. Тут не основы мироздания должны крутиться, а павн-код и близкие к этому темы.

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Лол, ты серьёзно? Можем вместе пройтись по форумам и посмотреть каких людей заносит в скриптинг.

Это к чему? Равняться на таких людей не нужно.

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Если я расскажу тебе о том, как я проехал сегодня от дома до работы, ты научишься водить автомобиль? Или если инженер расскажет тебе о том, как он строил дом, сможешь ли ты построить такой же дом?

Ты расскажешь, а тут как раз показывают.

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Именно. Оптимизации нельзя научить конкретными примерами. Нужно понимать то, что ты пишешь и знать как компьютер будет обрабатывать твой код, прежде чем браться за оптимизацию

Ну вот, уже меньше каких-то абстракций. Оптимизации конкретными примерами научить-то можно, просто, действительно, не факт что человек сам дойдёт до того, как именно это работает изнутри. Т.е. без углублений в принцип работы всех этих примеров человек сможет пользоваться ими только в очень схожих ситуациях. Это, конечно, не очень хорошо, но это ведь лучше, чем ничего, верно?

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

И тут нужно либо давать готовые решения, не пытаясь это выдавать за какие-либо уроки, либо пытаться объяснять почему нужно делать именно так, а не иначе (что будет мало толку приносить, судя по уровню усвоения информации у многих людей).

Если сам знаешь - объясняй. Как ты сам сказал, судя по уровню усвоения информации всем проще просто дать конкретные примеры.
Ну а вообще очень удивляет то, что с твоей точки зрения ориентироваться нужно на каких-то самых недалёких людей. Если они не понимают чего-то очевидного - их проблемы. В попу дуть таким я смысла не вижу, как и какой-то отдачи от них в будущем.

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Хотя можно просто оптимизировать код внутри цикла и избавится от лагов (а ещё лучше - оптимизировать код и разбить его на индивидуальные таймеры).
...
То бишь, подобный подход - это попытка обойти проблему очередным костылём, а не исправить её.

Что-то как-то не вяжется. Даже при оптимизированном коде внутри одного, но громоздкого цикла, всё равно лучше будет переводить на индивидуальные таймеры. Где костыль?

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Скрипт изначально нужно писать оптимизированно, строя код максимально логично. Тогда и никакие методы оптимизации не нужны будут. Когда люди это поймут - всем на Земле станет чуточку лучше. Ну или в SA-MP, как минимум.

Без знания методов оптимизации и оптимизировать, мягко говоря, сложновато.

П.с.

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

for(new i; i < GetPlayerPoolSize()+1; i++)

и
for(new i; i <= GetPlayerPoolSize(); i++)

for(new i = GetPlayerPoolSize(); i != -1; --i) // ;)

1

#24
Пользователь офлайн   m1n1vv 

  • Искусственный Cверхинтеллект
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

for(new i = GetPlayerPoolSize(); i != -1; --i) // ;)


GetPlayerPoolSize()+1
0

#25
Пользователь офлайн   Sound 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Скрипт изначально нужно писать оптимизированно, строя код максимально логично. Тогда и никакие методы оптимизации не нужны будут. Когда люди это поймут - всем на Земле станет чуточку лучше. Ну или в SA-MP, как минимум.

Уже начинаешь сам себе противоречить.

Просмотр сообщенияDeimoS (11 Сентябрь 2016 - 00:24) писал:

Ну да, отличный пример в виде какого-то сомнительного сервера, который, возможно, существовал.

Это лишь пример. Ты не знаешь как работают функции? Если функция ничего не возвращает, то скрипт попросту зависает на ней.

Вот с этого и идет пример, что на сервере 300 человек и цикл работает на 300 итераций, а внутри него лежат функции/алгоритмы, которые его сильно задерживают. И вот уже цикл отстал на 1,300 мс. С таймером же всё проще, все эти функции выполнятся, но лишь 1 раз, а не 300, вернув значение и продолжив свою работу.
Вот тебе самый банальный пример:

Скрытый текст [Показать]

Сообщение отредактировал Sound: 11 Сентябрь 2016 - 13:03

0

#26
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Так в том то и смысл, что это форум павн-скриптинга, а не бюро, которое наталкивает на правильные пути. Тут не основы мироздания должны крутиться, а павн-код и близкие к этому темы.
...
Это к чему? Равняться на таких людей не нужно.


Именно. Это форум о Pawn-скриптинге. И раздел, как ты можешь заметить, называется "Уроки". А какой может быть урок без внятного объяснения? Представь, что в школе на математике тебя не учат логике сложения/вычитания, а учат конкретным примером того, что если встретишь надпись "2+2=", то тогда нужно подставлять в конец "4". Вот в этой теме вы чем-то подобным занимаетесь.

Раздел с уроками создан именно для новичков, которые ничего в Pawn не смыслят. И ровняться нужно именно на них, иначе какой смысл от уроков для людей, которые и так всё знают?

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Ты расскажешь, а тут как раз показывают.

Ну давай приведу простой пример: система регистрации. Почти все статьи на эту тему раньше как раз именно показывали как выглядит код. Много ли ты в это время видел модов с качественной регистрацией? Меньше ли стало вопросов на эту тему? Нет.
Что сделал я? Рассказал. Дал конкретный пример (код) и разжевал его до максимума. Результаты ты, думаю, и сам заметить мог.

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Ну вот, уже меньше каких-то абстракций. Оптимизации конкретными примерами научить-то можно, просто, действительно, не факт что человек сам дойдёт до того, как именно это работает изнутри. Т.е. без углублений в принцип работы всех этих примеров человек сможет пользоваться ими только в очень схожих ситуациях. Это, конечно, не очень хорошо, но это ведь лучше, чем ничего, верно?

Лучше было бы хотя бы взять и перевести статью y_less'a, а не изобретать велосипед с квадратными колёсами.

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Если сам знаешь - объясняй.


Этим я и занимаюсь в любой свободный момент времени.


Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Ну а вообще очень удивляет то, что с твоей точки зрения ориентироваться нужно на каких-то самых недалёких людей. Если они не понимают чего-то очевидного - их проблемы. В попу дуть таким я смысла не вижу, как и какой-то отдачи от них в будущем.


Лол. Опять возвращаемся к теме о том, для кого создан этот раздел и почему люди, которые пришли получать знания, должны уже эти знания иметь

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Что-то как-то не вяжется. Даже при оптимизированном коде внутри одного, но громоздкого цикла, всё равно лучше будет переводить на индивидуальные таймеры. Где костыль?

Перечитай ещё раз моё сообщение. Я там говорил о минусах индивидуальных таймеров.

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

Без знания методов оптимизации и оптимизировать, мягко говоря, сложновато.


Шаблон != метод.

Просмотр сообщенияNexius (11 Сентябрь 2016 - 11:11) писал:

for(new i = GetPlayerPoolSize(); i != -1; --i) // ;)



Эмм, я дал лишь простой пример. Это во-первых.
Во-вторых, лучше будет вот так:
for(new i = GetPlayerPoolSize()+1; --i != 0;)

ибо условия с нулём работают шустрее
1

#27
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSound (11 Сентябрь 2016 - 13:00) писал:

Уже начинаешь сам себе противоречить.


Для людей в танке объясняю:
Если понимать принципы обработки кода компьютером и знать то, на какую оптимизацию способен компилятор, можно изначально писать "правильный" код. Ты не будешь писать сначала говнокод, а потом его исправлять => это нельзя назвать оптимизацией. Вот и всё.



Просмотр сообщенияSound (11 Сентябрь 2016 - 13:00) писал:

Это лишь пример. Ты не знаешь как работают функции? Если функция ничего не возвращает, то скрипт попросту зависает на ней.


Лолчто? Функция ничего не возвращает - это когда так:
stock test()
{
    return;
}

А то, о чём говоришь ты, это следствие однопоточности.

Просмотр сообщенияSound (11 Сентябрь 2016 - 13:00) писал:

Вот с этого и идет пример, что на сервере 300 человек и цикл работает на 300 итераций, а внутри него лежат функции/алгоритмы, которые его сильно задерживают. И вот уже цикл отстал на 1,300 мс.


Делаешь вот так:
public OnGameModeInIt()
{
    SetTimer("@___UpdatePlayer", 1000, false);
}

@___UpdatePlayer();
@___UpdatePlayer()
{
    //Тут твой цикл и прочий код
    return SetTimer("@___UpdatePlayer", 1000, false);
}

И полного зависания сервера ты никогда не получишь. А если он начнёт лагать - поздравляю, в твоём цикле говнокод.

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


Лол. Ты и тут не особо вник в принципы работы...
Вся разница между 1 таймером с циклом и кучей таймеров в том, что в первом случае есть цикл, который обрабатывает твой говнокод (а он именно говнокод, если вызывает лаги) и пока цикл не закончит работу, сервер, собственно, обрабатывает цикл. Во втором же случае твой говнокод вызывается так же 300 раз, только в разные промежутки времени. И чем больше таких таймеров запущено и хуже в них код, тем меньше "окон" для обработки других функций, и тем ближе очередные подвисания.

Кучей таймеров вы не избавляетесь от проблемы. Вы лишь расширяете так называемый "критический лимит нагрузки", после которого на сервере начнутся лаги, перекладывая нагрузку на ЦП, который будет все эти таймеры гонять, и память, в которой временная метка для каждого таймера будет хранится. Это как вместо того, чтоб удалить ржавчину, вы просто будете её краской закрашивать в надежде, что она исчезнет.

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

Сообщение отредактировал DeimoS: 13 Сентябрь 2016 - 15:44

0

#28
Пользователь офлайн   Nexius 

  • Знаток
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:22) писал:

Раздел с уроками создан именно для новичков, которые ничего в Pawn не смыслят. И ровняться нужно именно на них, иначе какой смысл от уроков для людей, которые и так всё знают?

Речь шла не о новичках, а о людях, которых "нужно учить думать".

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:22) писал:

Ну давай приведу простой пример: система регистрации. Почти все статьи на эту тему раньше как раз именно показывали как выглядит код. Много ли ты в это время видел модов с качественной регистрацией? Меньше ли стало вопросов на эту тему? Нет.
Что сделал я? Рассказал. Дал конкретный пример (код) и разжевал его до максимума. Результаты ты, думаю, и сам заметить мог.

На такую банальщину, как регистрация, если честно не обращал внимания. Но если ты кому-то что-то хорошо объяснил - продолжай, никто ж не против.

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:22) писал:

Лучше было бы хотя бы взять и перевести статью y_less'a, а не изобретать велосипед с квадратными колёсами.

Опять же, мы будем очень рады.

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:22) писал:

Перечитай ещё раз моё сообщение. Я там говорил о минусах индивидуальных таймеров.

Эти минусы ничто, по сравнению с их плюсами.

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:22) писал:

Шаблон != метод.

Тем не менее он всё равно даёт хоть какое-то представление.

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:22) писал:

Во-вторых, лучше будет вот так:
for(new i = GetPlayerPoolSize()+1; --i != 0;)

ибо условия с нулём работают шустрее

Лучше, но портится читабельность такого кода.

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:43) писал:

Кучей таймеров вы не избавляетесь от проблемы. Вы лишь расширяете так называемый "критический лимит нагрузки", после которого на сервере начнутся лаги, перекладывая нагрузку на ЦП, который будет все эти таймеры гонять, и память, в которой временная метка для каждого таймера будет хранится. Это как вместо того, чтоб удалить ржавчину, вы просто будете её краской закрашивать в надежде, что она исчезнет.

Нет, это ещё один плюс к оптимизации. Если мод содержит в себе чуть больше, чем систему регистрации и разноцветных ников, то вероятность лагов с кодом, разово выполняющемся для всех в цикле, будет более велика, чем если бы он выполнялся отдельно для каждого в разное время.
Кто-то вообще предлагает разделять циклы на несколько таймеров - так вот это почти тоже самое, но ещё лучше, т.к. код выполняется не в цикле с перебором всех слотов на сервере, а только для игроков, которые действительно онлайн. А не было бы foreach - это было бы лучшим вариантом вообще.

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:43) писал:

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

Приведи примеры из темы, которые ухудшат производительность.
Действительно добровольное, только интересно, какое это отношение имеет.

Сообщение отредактировал Nexius: 13 Сентябрь 2016 - 18:26

0

#29
Пользователь офлайн   krutoy.krosch 

  • Banned
  • Вставить ник
  • Раскрыть информацию
Под ваш спор салатик кукурузный хорошо идет

ням ням

Сообщение отредактировал krutoy.krosch: 13 Сентябрь 2016 - 18:32


#30
Пользователь офлайн   Sound 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (13 Сентябрь 2016 - 15:43) писал:

перекладывая нагрузку на ЦП

Ты их людей, которые не любят платить за хост? На хороших хостингах и оборудование способствует, которые прожуют твои таймера и выплюнут. И ты уже неоднократно себе противоречишь(х2). Тренируй афоризм.

Не вижу смысла продолжать спор с человеком, который живет в каких-то отдаленных иллюзиях :wink:
0

Поделиться темой:


  • (9 Страниц) +
  • 1
  • 2
  • 3
  • 4
  • 5
  • Последняя »
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей