21:20
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Модератор форума: Dima-kun  
Оптимизация кода
ImperealДата: Понедельник, 02.05.2011, 13:59 | Сообщение # 1
Мастер джэдай
Группа: I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
Репутация: 1868
Замечания: 100%
Статус:
Здраствуйте, сегодня хочу расказать что же такое оптимизация кода, для чего она нужна и как же её сделать.
(( Вся стстья написана полностью мной и так как я понимаю и делаю. ))

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

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

Начнём с циклов.
В циклах, когда нужно выполнить его для всех игроков, обычно используют MAX_PLAYERS, тем самым выполняя действие 500 раз, но при этом мало у кого на сервере стоит реально 500 слотов.Поэтому я бы советовал использховать GetMaxPlayers(), тогда сервер будет получать кол-во реальных слотов и выполнять действие столько раз сколько у вас слотов, не нагружая его лишними действиями.

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



Дальше, я думаю на нагрузку на сервер это не влияет, но делает код меньше и удобней.

Если вы пишите множество условий, но при этом некоторые действия выполняются в любом из них, то можно просто данное действие вынести за пределы условий, так как оно выполнится в любом случае.
Например:

Code
if(a[playerid] == 1)
{
a[playerid] = 5;
b=1;
}
else if(a[playerid] == 2)
{
a[playerid] = 4;
b=1;
}
else if(a[playerid] == 3)
{
a[playerid] = 7;
b=1;
}
else if(a[playerid] == 4)
{
a[playerid] = 10;
b=1;
}
else
{
a[playerid] = 9;
b=1;
}

Хотя гораздо проще было бы сделать:
Code
if(a[playerid] == 1)
{
a[playerid] = 5;
}
else if(a[playerid] == 2)
{
a[playerid] = 4;
}
else if(a[playerid] == 3)
{
a[playerid] = 7;
}
else if(a[playerid] == 4)
{
a[playerid] = 10;
}
else
{
a[playerid] = 9;
}
b=1;



Или ещё один пример:

Code
if(a[playerid] == 1)
{
a[playerid] = 2;
}
else if(a[playerid] == 2)
{
a[playerid] = 3;
}
else if(a[playerid] == 3)
{
a[playerid] = 4;
}

Хотя,тут можно обойтись без условий.

Code
a[playerid] ++;



Ещё,все наверно ставят условия такого вида:
Code
if(PlayerAdmin[playerid] == 0)
{
SendClientMessage(playerid,COLOR_WHITE,"Вы не администратор!");
return 1;
}

Я бы советовал делать проще,возвращать сообщение:

Code
if(PlayerAdmin[playerid] == 0)return SendClientMessage(playerid,COLOR_WHITE,"Вы не администратор!");



Switch/case

Так же условия такого вида:

Code
if(dialogid == 0)
{
}
if(dialogid == 1)
{
}
if(dialogid == 2)
{
}

Я бы советовал заменять на

Code
switch(dialogid)
{
case 0:
case 1:
case 2:
}

Так как конструкция switch/case работает значительно быстрее и использовать её гораздо удобнее(во всяком случае мне).



Сейчас ещё вспомнил частую ошибку,которую постоянно видел:
Code
if(PlayerAdmin[playerid] > 0){}
else if(PlayerAdmin[playerid] == 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");}

Зачем делать условие при прохождение котрого,ничего не пройзойдет - это глупо!
Правильный пример:
Code
if(PlayerAdmin[playerid] == 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");}

Кстати,если при прохождение проверки исполняется одно действие,то { } ставить не обязательно,то есть можно оставить так:

Code
if(PlayerAdmin[playerid] == 0)SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");

И на конец,забудьте глупое утверждение,что чем больше код тем он "круче",совсем наоборот,чем меньше по объему ваш код,тем лучше,главное это функциональность этого самого кода!

Статья подготовлена специально для rp-sc.ru и samp-rus.com,копирование статьи на другие проекты запрещено.


Прощай самп-рус =Р

Сообщение отредактировал Impereal - Понедельник, 02.05.2011, 14:10
EakwarpДата: Понедельник, 02.05.2011, 14:13 | Сообщение # 2
Мастер джэдай
Группа: Продвинутые
Сообщений: 4874
Награды: 179
Город: Москва
Репутация: 2543
Замечания: 60%
Статус:
Quote (Impereal)
Начнём с циклов.

И вот, прошло уже больше года со дня релиза foreach от Y_Less'a, а они все еще выдумывают что то c GetMaxPlayers...



More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.


Valakas Roleplay on Twitter

Платные консультации, разработка, в ICQ. Дорого.
toneysixДата: Понедельник, 02.05.2011, 14:21 | Сообщение # 3
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Impereal
Увы, но с GetMaxPlayers() за счет вызова функции далеко не лучший вариант.
Результаты:
GetMaxPlayers - 1315ms (для справки я выставил всего 200 слотов)
Просто 500 игроков - 311ms
http://best.of.by/paste/d1073b89
В этом ты ошибся, и как сказал ув.Eakwarp пора обновляться.
Далее на счет условий, там, где возможно лучше всегда использовать оператор переключатель "switch".
Далее пример с возвратом тоже не лучший способ, во-первых, иной раз ты не знаешь, что вернет функция SendClientMessage, во-вторых, это полностью идентично действию и я не думаю, что это прибавит частоту выполнения.
if(PlayerAdmin[playerid] == 0)
{
SendClientMessage(playerid,COLOR_WHITE,"Вы не администратор!");
return 1;
}
Только в первом случаи ты вызываешь функцию и возвращаешь полученное значение из функции.



Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru

Сообщение отредактировал toneysix - Понедельник, 02.05.2011, 14:23
ImperealДата: Понедельник, 02.05.2011, 14:21 | Сообщение # 4
Мастер джэдай
Группа: I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
Репутация: 1868
Замечания: 100%
Статус:
Quote (Eakwarp)
foreach от Y_Less'a

Это,собственно,что и для чего?
А то я как то не в курсе :)



Прощай самп-рус =Р
EakwarpДата: Понедельник, 02.05.2011, 14:22 | Сообщение # 5
Мастер джэдай
Группа: Продвинутые
Сообщений: 4874
Награды: 179
Город: Москва
Репутация: 2543
Замечания: 60%
Статус:
Quote (Impereal)
Это,собственно,что и для чего?

http://forum.sa-mp.com/showthread.php?t=92679



More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.


Valakas Roleplay on Twitter

Платные консультации, разработка, в ICQ. Дорого.
ImperealДата: Понедельник, 02.05.2011, 14:23 | Сообщение # 6
Мастер джэдай
Группа: I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
Репутация: 1868
Замечания: 100%
Статус:
Quote (toneysix)
Далее на счет условий, там, где возможно лучше всегда использовать оператор переключатель "switch".

Про это написал.
Quote (toneysix)
Далее пример с возвратом тоже не лучший способ, во-первых, иной раз ты не знаешь, что вернет функция SendClientMessage, во-вторых, это полностью идентично действию и я не думаю, что это прибавит частоту выполнения. if(PlayerAdmin[playerid] == 0) { SendClientMessage(playerid,COLOR_WHITE,"Вы не администратор!"); return 1; } Только в первом случаи ты вызываешь функцию и возвращаешь полученное значение из функции.

Окей,учту.
Написал как сам делаю и как думаю,возможно в чём то не прав :)



Прощай самп-рус =Р
EakwarpДата: Понедельник, 02.05.2011, 14:32 | Сообщение # 7
Мастер джэдай
Группа: Продвинутые
Сообщений: 4874
Награды: 179
Город: Москва
Репутация: 2543
Замечания: 60%
Статус:
Ну кроме всего прочего настоятельно рекомендую к прочтению http://forum.sa-mp.com/showthread.php?t=166680 .

Добавлено (02.05.2011, 14:32)
---------------------------------------------
upd. лучше перевести на русский ссылку выше, чем велосипеды изобретать.


More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.


Valakas Roleplay on Twitter

Платные консультации, разработка, в ICQ. Дорого.
Fus1Дата: Понедельник, 02.05.2011, 15:05 | Сообщение # 8
Группа: Продвинутые
Сообщений: 2704
Награды: 121
Город: Melbourne Australia
Репутация: 3103
Замечания: 0%
Статус:
Как бы против ничего не имею, но не легче тогда уж если такой способ , то ввести примерное кол-во слотов и всё.

Code
#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#endif
#define MAX_PLAYERS 50 //кол-во слотов на сервере

ImperealДата: Понедельник, 02.05.2011, 15:32 | Сообщение # 9
Мастер джэдай
Группа: I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
Репутация: 1868
Замечания: 100%
Статус:
Quote (Fus1)
#if defined MAX_PLAYERS #undef MAX_PLAYERS #endif #define MAX_PLAYERS 50 //кол-во слотов на сервере

Можно и так,конечно!
Но если увеличишь слоты и забудешь константу изменить,сразу работа сервера нарушиться!



Прощай самп-рус =Р
Fus1Дата: Понедельник, 02.05.2011, 15:38 | Сообщение # 10
Группа: Продвинутые
Сообщений: 2704
Награды: 121
Город: Melbourne Australia
Репутация: 3103
Замечания: 0%
Статус:
Impereal, ну это в любом случае получше будет, ну по крайне мере я так использую и мне нормально, ну и с MAX_VEHICLE точно так-же.

Code
#if defined MAX_VEHICLES
#undef MAX_VEHICLES
#endif
#define MAX_VEHICLES 100

чем ближе к реальному числу стоит MAX_VEHICLE тем меньше нагрузки.
Кстати ,

Code
#if defined MAX_PLAYERS #undef MAX_PLAYERS #endif #define MAX_PLAYERS 50 //кол-во слотов на сервере

зачем извращать ? мне вот по другому лучше понятно и сразу видно что и как чем тут глаза мозолить.

GoshikДата: Понедельник, 02.05.2011, 15:39 | Сообщение # 11
Уверенный в себе
Группа: Пользователи
Сообщений: 280
Награды: 1
Город: ---
Репутация: 18
Замечания: 60%
Статус:
Quote (Impereal)
Можно и так,конечно! Но если увеличишь слоты и забудешь константу изменить,сразу работа сервера нарушиться!

как ты забудешь? сервер не запустится просто, если MAX_PLAYERS будет меньше чем в конфиге

Fus1Дата: Понедельник, 02.05.2011, 15:41 | Сообщение # 12
Группа: Продвинутые
Сообщений: 2704
Награды: 121
Город: Melbourne Australia
Репутация: 3103
Замечания: 0%
Статус:
Goshik, запуститься то он запустить , ну должен по крайне мере, кстати, с авто реально можно забыть, но просто ставим памятку себе в начале мода и всё, не забываем yes
Ghost-XДата: Понедельник, 02.05.2011, 15:42 | Сообщение # 13
Мастер джэдай
Группа: Продвинутые
Сообщений: 3548
Награды: 36
Город: Наб. Челны
Репутация: 856
Замечания: 40%
Статус:
Quote (Impereal)
if(a[playerid] == 1)
{
a[playerid] = 5;
}
else if(a[playerid] == 2)
{
a[playerid] = 4;
}
else if(a[playerid] == 3)
{
a[playerid] = 7;
}
else if(a[playerid] == 4)
{
a[playerid] = 10;
}
else
{
a[playerid] = 9;
}

Главная оптимизация:
Code

if(a[playerid] == 1) a[playerid] = 5;
else if(a[playerid] == 2) a[playerid] = 4;
else if(a[playerid] == 3) a[playerid] = 7;  
else if(a[playerid] == 4) a[playerid] = 10;  
else a[playerid] = 9;

Ну или в конечном счете использовать switch



Спор на форуме, все равно что олимпиада среди умственно отсталых: даже если ты победил, ты все равно гермофродит.
Хочешь остаться при своем мнении - держи его при себе.
ImperealДата: Понедельник, 02.05.2011, 15:44 | Сообщение # 14
Мастер джэдай
Группа: I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
Репутация: 1868
Замечания: 100%
Статус:
Quote (Ghost-X)
if(a[playerid] == 1) a[playerid] = 5; else if(a[playerid] == 2) a[playerid] = 4; else if(a[playerid] == 3) a[playerid] = 7;   else if(a[playerid] == 4) a[playerid] = 10;   else a[playerid] = 9;

Ну да,только я там чуть чуть другое имел ввиду ;)
А так то вот
Quote (Impereal)
Кстати,если при прохождение проверки исполняется одно действие,то { } ставить не обязательно,то есть можно оставить так: Codeif(PlayerAdmin[playerid] == 0)SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");



Прощай самп-рус =Р

Сообщение отредактировал Impereal - Понедельник, 02.05.2011, 15:45
EakwarpДата: Понедельник, 02.05.2011, 20:11 | Сообщение # 15
Мастер джэдай
Группа: Продвинутые
Сообщений: 4874
Награды: 179
Город: Москва
Репутация: 2543
Замечания: 60%
Статус:
Fus1, двойка с минусом, все равно медленнее foreach.
Impereal, советую переписать весь фак, без использования неправильных примеров.



More than 4 years of development, more than 250,000 lines of source code, more than a hundred units and more than 3400 revisions. Valakas Roleplay - choose your role.


Valakas Roleplay on Twitter

Платные консультации, разработка, в ICQ. Дорого.
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua