PDA

Просмотр полной версии : [Вопрос] Оптимизация



Sarah
12.02.2018, 18:21
Всем привет
Написал небольшой мод, хотел бы спросить у вас, неплоха ли оптимизация и читабелен ли код?
Pastebin - Клик (https://pastebin.com/jAPpq9Td)

P.S. Спасибо DeimoS )

$continue$
12.02.2018, 18:56
Не в том месте пытаешься искать, что оптимизировать. Оптимизируй алгоритмы, ищи слабые места в моде с помощью профайлера (http://forum.sa-mp.com/showthread.php?t=271129)

Sarah
12.02.2018, 21:49
Не в том месте пытаешься искать, что оптимизировать. Оптимизируй алгоритмы, ищи слабые места в моде с помощью профайлера (http://forum.sa-mp.com/showthread.php?t=271129)

Ну а все же?)

pawnoholic
12.02.2018, 23:40
Код не соответствует мировым стандартам, читаемость кода оставляет желать лучшего.

1. Имена переменных должны быть записаны в смешанном регистре, начиная с нижнего.

Не правильно:

new mysql_id;

Правильно:

new mysqlHandle;

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

Не правильно:


enum player_info {
ID,
Name[MAX_PLAYER_NAME],
Pass[24],
Language, // 1 - Russian, 2 - English
Sex,
Skin,
};
new pInfo[MAX_PLAYERS][player_info];


Правильно:



enum E_PLAYER_INFO
{
E_PLAYER_ID,
E_PLAYER_NAME[MAX_PLAYER_NAME],
E_PLAYER_PASS[24],
E_PLAYER_LANGUAGE,
E_PLAYER_SEX,
E_PLAYER_SKIN,
}
new PlayerInfo[MAX_PLAYERS][E_PLAYER_INFO];


Есть еще и другие пункты, но для начала этого будет достаточно.

DeimoS
12.02.2018, 23:57
Код не соответствует мировым стандартам

Ну это слишком громко сказано :) Нет одного общего стандарта. Стандарты есть лишь у конкретных языков. И от языка к языку они варьируются, исходя из особенностей языков.
Так же, например, есть такая штука, как "Венгерская нотация (https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BD%D0%B3%D0%B5%D1%80%D1%81%D0%BA%D0%B0%D1%8F_%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F)". А первый твой пункт описан вот тут (https://ru.wikipedia.org/wiki/CamelCase) и там же есть примеры того, как в разных языках используются разные вариации игр с регистром.

Вот в этой (http://pro-pawn.ru/showthread.php?8347-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8E-%D0%BA%D0%BE%D0%B4%D0%B0) теме отобраны адекватные среди наиболее распространённых вариантов оформления кода. И если уж чего-то придерживаться в SA-MP, то приближенного к той теме.

Sarah
13.02.2018, 00:05
Код не соответствует мировым стандартам, читаемость кода оставляет желать лучшего.

1. Имена переменных должны быть записаны в смешанном регистре, начиная с нижнего.

Не правильно:

new mysql_id;

Правильно:

new mysqlHandle;

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

Не правильно:


enum player_info {
ID,
Name[MAX_PLAYER_NAME],
Pass[24],
Language, // 1 - Russian, 2 - English
Sex,
Skin,
};
new pInfo[MAX_PLAYERS][player_info];


Правильно:



enum E_PLAYER_INFO
{
E_PLAYER_ID,
E_PLAYER_NAME[MAX_PLAYER_NAME],
E_PLAYER_PASS[24],
E_PLAYER_LANGUAGE,
E_PLAYER_SEX,
E_PLAYER_SKIN,
}
new PlayerInfo[MAX_PLAYERS][E_PLAYER_INFO];


Есть еще и другие пункты, но для начала этого будет достаточно.

Как по мне - это небольшой бред
Все и так понятно, зачем что-то еще переделывать?

DeimoS
13.02.2018, 00:09
Касаемо просьбы автора.

Первое, что бросилось в глаза - ошибки с вещественными аргументами (указание целых чисел там, где должно быть вещественное число)


SetPlayerPos(playerid, 0, 0, 5);
Это создаёт лишние вызовы функции float

А вот такие конструкции


if(!strlen(inputtext) || strlen(inputtext) > 24) return Show_Register(playerid);
strmid(pInfo[playerid][Pass], inputtext, 0, 64, 255);
можно реализовать так

if(!(0 <= strlen(inputtext) <= 24)) return Show_Register(playerid);
strmid(pInfo[playerid][Pass], inputtext, 0, 64, 255);
Или же так:

new len = strlen(inputtext);
if(!len || len > 24) return Show_Register(playerid);
strmid(pInfo[playerid][Pass], inputtext, 0, 64, 255);
Тем самым не заставляя сервер обращаться к одной и той же нативке для получения одной и той же информации.



Вот эту конструкцию


switch(listitem) {
case 0: pInfo[playerid][Language] = 1;
case 1: pInfo[playerid][Language] = 2;
}
Вполне можно заменить на такую строку:

pInfo[playerid][Language] = listitem+1;



Ну и вот, например, тут


case D_LOGIN: {
if(!response) return Kick(playerid);
new query[44+24];
if(!strlen(inputtext) || strlen(inputtext) > 24) return Show_Login(playerid);
if(!strcmp(pInfo[playerid][Pass], inputtext)) {
mysql_format(mysql_id, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Pass`='%s'", inputtext);
mysql_function_query(mysql_id, query, true, "@_LoadAccount", "i", playerid);
} else {
SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass")+1);
SCM(playerid, -1, "You have entered the wrong password many times, so they were kicked.");
Show_Login(playerid);
if(GetPVarInt(playerid, "WrongPass") >= 3) return Kick(playerid);
}
return true;
}
ты объявляешь массив "new query[44+24];" до проверок, которые никак не связаны с этим массивом. То бишь, если игрок, например, не ввёл ничего в диалоговое окно и условие " if(!strlen(inputtext)" сработало, прервав дальнейшую обработку кода, этот массив всё равно будет инициализирован, на что потратится время. Достаточно переместить его за проверку и такого уже не будет (а в твоём случае его вообще стоит перенести в конкретное условие, в котором используется массив)


case D_LOGIN: {
if(!response) return Kick(playerid);
if(!strlen(inputtext) || strlen(inputtext) > 24) return Show_Login(playerid);
if(!strcmp(pInfo[playerid][Pass], inputtext)) {
new query[44+24];
mysql_format(mysql_id, query, sizeof(query), "SELECT * FROM `accounts` WHERE `Pass`='%s'", inputtext);
mysql_function_query(mysql_id, query, true, "@_LoadAccount", "i", playerid);
} else {
SetPVarInt(playerid, "WrongPass", GetPVarInt(playerid, "WrongPass")+1);
SCM(playerid, -1, "You have entered the wrong password many times, so they were kicked.");
Show_Login(playerid);
if(GetPVarInt(playerid, "WrongPass") >= 3) return Kick(playerid);
}
return true;
}


Пока всё

Sarah
13.02.2018, 00:10
Ну это слишком громко сказано :) Нет одного общего стандарта. Стандарты есть лишь у конкретных языков. И от языка к языку они варьируются, исходя из особенностей языков.
Так же, например, есть такая штука, как "Венгерская нотация (https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BD%D0%B3%D0%B5%D1%80%D1%81%D0%BA%D0%B0%D1%8F_%D0%BD%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F)". А первый твой пункт описан вот тут (https://ru.wikipedia.org/wiki/CamelCase) и там же есть примеры того, как в разных языках используются разные вариации игр с регистром.

Вот в этой (http://pro-pawn.ru/showthread.php?8347-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8E-%D0%BA%D0%BE%D0%B4%D0%B0) теме отобраны адекватные среди наиболее распространённых вариантов оформления кода. И если уж чего-то придерживаться в SA-MP, то приближенного к той теме.

Спасибо за последнюю тему, почитаю )
Можешь подсказать, где найти тему, в которой объясняется #defined #endif ну и так далее, совсем этого не понимаю

UCP: Понял, исправлюсь )

DeimoS
13.02.2018, 00:15
[Урок] Препроцессор (http://pro-pawn.ru/showthread.php?14640-%D0%9F%D1%80%D0%B5%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80)

Snegovik1337
13.02.2018, 16:29
Вызывать регистрацию в OnPlayerConnect, не самый лучший вариант, версия 0.3DL даст о себе знать

- - - Добавлено - - -

Это


case D_REG_SEX: {
if(!response) return Kick(playerid);
new rand;
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
rand = random(sizeof(Random_Skin_Male));
pInfo[playerid][Skin] = Random_Skin_Male[rand];
}
case 1: {
pInfo[playerid][Sex] = 2;
rand = random(sizeof(Random_Skin_Female));
pInfo[playerid][Skin] = Random_Skin_Female[rand];
}
}
CreateNewAccount(playerid);
return true;
}
На


case D_REG_SEX: {
if(!response) return Kick(playerid);
pInfo[playerid][Sex] = listitem + 1;
pInfo[playerid][Skin] = (listitem == 0)?
(Random_Skin_Male[random(sizeof(Random_Skin_Male))]):(Random_Skin_Female[random(sizeof(Random_Skin_Female))]);
CreateNewAccount(playerid);
return true;
}

Sarah
13.02.2018, 17:52
Вызывать регистрацию в OnPlayerConnect, не самый лучший вариант, версия 0.3DL даст о себе знать

- - - Добавлено - - -

Это


case D_REG_SEX: {
if(!response) return Kick(playerid);
new rand;
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
rand = random(sizeof(Random_Skin_Male));
pInfo[playerid][Skin] = Random_Skin_Male[rand];
}
case 1: {
pInfo[playerid][Sex] = 2;
rand = random(sizeof(Random_Skin_Female));
pInfo[playerid][Skin] = Random_Skin_Female[rand];
}
}
CreateNewAccount(playerid);
return true;
}
На


case D_REG_SEX: {
if(!response) return Kick(playerid);
pInfo[playerid][Sex] = listitem + 1;
pInfo[playerid][Skin] = (listitem == 0)?
(Random_Skin_Male[random(sizeof(Random_Skin_Male))]):(Random_Skin_Female[random(sizeof(Random_Skin_Female))]);
CreateNewAccount(playerid);
return true;
}

На счет регистрации не очень понял
А насчет выбора пола - спасибо :)

Snegovik1337
13.02.2018, 19:01
Вызывай регистрацию в OnPlayerRequestClass, иначе будет в 0.3DL так

https://image.prntscr.com/image/X37eBhknSnKV2jwSA0MRVA.png

Sarah
13.02.2018, 19:12
Вызывай регистрацию в OnPlayerRequestClass, иначе будет в 0.3DL так

https://image.prntscr.com/image/X37eBhknSnKV2jwSA0MRVA.png

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

DeimoS
14.02.2018, 09:22
Я не собираюсь пока что использовать, но ладно, в будущем возьму на заметке

Лучше сразу переписать и сделать правильно, дабы потом остальные системы, зависимые от регистрации, не развалились и не начали глючить :)

Sarah
14.02.2018, 12:24
Лучше сразу переписать и сделать правильно, дабы потом остальные системы, зависимые от регистрации, не развалились и не начали глючить :)

У меня почему-то персонаж не спавнится, только после того как я нажму кнопку "spawn"
Хотя SpawnPlayer стоит в загрузке аккаунта

DeimoS
14.02.2018, 12:41
[Мануал] Обход стандартного выбора скина (скрыть кнопки "<<", ">>" и "Spawn") (http://pro-pawn.ru/showthread.php?13526-%D0%9E%D0%B1%D1%85%D0%BE%D0%B4-%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE-%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0-%D1%81%D0%BA%D0%B8%D0%BD%D0%B0-%28%D1%81%D0%BA%D1%80%D1%8B%D1%82%D1%8C-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8-%D0%B8-Spawn-%29)

$continue$
14.02.2018, 13:19
В данном случай ты убил читаемость кода, почти на 0. В таких ситуациях лучше не использовать тернарный оператор.

Вызывать регистрацию в OnPlayerConnect, не самый лучший вариант, версия 0.3DL даст о себе знать

- - - Добавлено - - -

Это


case D_REG_SEX: {
if(!response) return Kick(playerid);
new rand;
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
rand = random(sizeof(Random_Skin_Male));
pInfo[playerid][Skin] = Random_Skin_Male[rand];
}
case 1: {
pInfo[playerid][Sex] = 2;
rand = random(sizeof(Random_Skin_Female));
pInfo[playerid][Skin] = Random_Skin_Female[rand];
}
}
CreateNewAccount(playerid);
return true;
}
На


case D_REG_SEX: {
if(!response) return Kick(playerid);
pInfo[playerid][Sex] = listitem + 1;
pInfo[playerid][Skin] = (listitem == 0)?
(Random_Skin_Male[random(sizeof(Random_Skin_Male))]):(Random_Skin_Female[random(sizeof(Random_Skin_Female))]);
CreateNewAccount(playerid);
return true;
}

DeimoS
14.02.2018, 14:45
Вызывать регистрацию в OnPlayerConnect, не самый лучший вариант, версия 0.3DL даст о себе знать

- - - Добавлено - - -

Это


case D_REG_SEX: {
if(!response) return Kick(playerid);
new rand;
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
rand = random(sizeof(Random_Skin_Male));
pInfo[playerid][Skin] = Random_Skin_Male[rand];
}
case 1: {
pInfo[playerid][Sex] = 2;
rand = random(sizeof(Random_Skin_Female));
pInfo[playerid][Skin] = Random_Skin_Female[rand];
}
}
CreateNewAccount(playerid);
return true;
}
На


case D_REG_SEX: {
if(!response) return Kick(playerid);
pInfo[playerid][Sex] = listitem + 1;
pInfo[playerid][Skin] = (listitem == 0)?
(Random_Skin_Male[random(sizeof(Random_Skin_Male))]):(Random_Skin_Female[random(sizeof(Random_Skin_Female))]);
CreateNewAccount(playerid);
return true;
}

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




Да ещё и лишних инструкций добавил, типа второго обращения к listitem и операции сложения, сохранив, при этом, условие. Кода стало меньше, но лучше он не стал :(

Long-
15.02.2018, 14:33
Я бы сделал так:

case D_REG_SEX:
{
if(!response)
return Kick(playerid);

pInfo[playerid][Sex] = listitem + 1;

if(pInfo[playerid][Sex] == 1)
pInfo[playerid][Skin] = Random_Skin_Male[random(sizeof(Random_Skin_Male))];
else
pInfo[playerid][Skin] = Random_Skin_Female[random(sizeof(Random_Skin_Female))];

CreateNewAccount(playerid);
return true;
}

DeimoS
15.02.2018, 15:43
Я бы сделал так:

case D_REG_SEX:
{
if(!response)
return Kick(playerid);

pInfo[playerid][Sex] = listitem + 1;

if(pInfo[playerid][Sex] == 1)
pInfo[playerid][Skin] = Random_Skin_Male[random(sizeof(Random_Skin_Male))];
else
pInfo[playerid][Skin] = Random_Skin_Female[random(sizeof(Random_Skin_Female))];

CreateNewAccount(playerid);
return true;
}

Тоже стоит понимать, что ради компактности ты жертвуешь процессорным временем :)
Тут действует принцип "китайского кода (http://lurkmore.to/%D0%98%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4#K.D0.B8.D1.82.D0.B0.D0.B9.D1.81.D0.BA.D0.B8.D0.B9_.D0.BA.D0.BE.D0.B4)": да, код более объёмный, но все вариации прописаны сразу, за счёт чего не происходит лишних обращений к переменным и прочих действий.

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

case D_REG_SEX: {
if(!response) return Kick(playerid);
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
pInfo[playerid][Skin] = Random_Skin_Male[random(sizeof(Random_Skin_Male)];
}
case 1: {
pInfo[playerid][Sex] = 2;
pInfo[playerid][Skin] = Random_Skin_Female[random(sizeof(Random_Skin_Female)];
}
}
CreateNewAccount(playerid);
return true;
}
В остальном код оптимален (нет повторных вызовов ни для listitem, ни для pInfo)

ziggi
15.02.2018, 18:49
Тоже стоит понимать, что ради компактности ты жертвуешь процессорным временем :)
Тут действует принцип "китайского кода (http://lurkmore.to/%D0%98%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4#K.D0.B8.D1.82.D0.B0.D0.B9.D1.81.D0.BA.D0.B8.D0.B9_.D0.BA.D0.BE.D0.B4)": да, код более объёмный, но все вариации прописаны сразу, за счёт чего не происходит лишних обращений к переменным и прочих действий.

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

case D_REG_SEX: {
if(!response) return Kick(playerid);
switch(listitem) {
case 0: {
pInfo[playerid][Sex] = 1;
pInfo[playerid][Skin] = Random_Skin_Male[random(sizeof(Random_Skin_Male)];
}
case 1: {
pInfo[playerid][Sex] = 2;
pInfo[playerid][Skin] = Random_Skin_Female[random(sizeof(Random_Skin_Female)];
}
}
CreateNewAccount(playerid);
return true;
}
В остальном код оптимален (нет повторных вызовов ни для listitem, ни для pInfo)

Лучше мужские и женские скины в одном массиве разместить, тогда switch/case будет не нужен.

DeimoS
15.02.2018, 21:12
Лучше мужские и женские скины в одном массиве разместить, тогда switch/case будет не нужен.

Так в любом случае нужно ведь будет определить какой пол выбрал игрок. Это притянет за собой либо дополнительную переменную, либо обращение к pInfo. К этому всему ещё и операции по получению ID пола из listitem.
Или может я не понял что-то?)

ziggi
15.02.2018, 21:36
Так в любом случае нужно ведь будет определить какой пол выбрал игрок. Это притянет за собой либо дополнительную переменную, либо обращение к pInfo. К этому всему ещё и операции по получению ID пола из listitem.
Или может я не понял что-то?)

Я это вижу как-то так:

case D_REG_SEX: {
if(!response) return Kick(playerid);
pInfo[playerid][Sex] = listitem + 1;
pInfo[playerid][Skin] = Random_Skin[listitem][random(strlen(Random_Skin[listitem])];
CreateNewAccount(playerid);
return true;
}

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

DeimoS
15.02.2018, 21:51
Ну значит я правильно понял. Если я правильно представляю принципы, по которым будет обрабатываться сей код, то увы, тут будет больше действий.

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

ziggi
15.02.2018, 22:59
Не только читаемости, но и масштабируемости)

Snegovik1337
16.02.2018, 00:52
// DeimoS
for(new i = 0; i < 10000; i++)

1) 6 + 6 + 7 + 7 + 6 / 5 = 6.4 //Snegovik1337
2) 7 + 6 + 6 + 6 + 5 / 5 = 6 //DeimoS
3) 8 + 7 + 8 + 7 + 8 / 5 = 7.6 //Long-
// Snegovik1337
for(new i = 0; i < 100000; i++)

1) 59 + 63 + 59 + 61 + 61 / 5 = 60.6 //Snegovik1337
2) 60 + 61 + 63 + 68 + 59 / 5 = 62.2 //DeimoS
3) 71 + 69 + 74 + 71 + 71 / 5 = 71.2 //Long-
// Snegovik1337
for(new i = 0; i < 1000000; i++)

1) 545 + 549 + 548 + 555 + 556 / 5 = 550.6 //Snegovik1337
2) 598 + 576 + 604 + 555 + 577 / 5 = 582 //DeimoS
3) 638 + 627 + 626 + 635 + 659 / 5 = 637 //Long-

Long-
16.02.2018, 11:50
// DeimoS
for(new i = 0; i < 10000; i++)

// Snegovik1337
for(new i = 0; i < 100000; i++)

// Snegovik1337
for(new i = 0; i < 1000000; i++)

Что это? -_-

Snegovik1337
16.02.2018, 14:38
Написано же, тест на скорость чей вариант быстрее

DeimoS
16.02.2018, 17:01
А исходный код теста увидеть можно?

Snegovik1337
16.02.2018, 19:51
https://pastebin.com/0ups9v9d
Один из вариантов открываешь, компилируешь и проверяешь результат, потом скрываешь, открываешь другой и так т.д.
Все сразу не стал сделать, ибо не корректно показывает

DeimoS
16.02.2018, 20:31
https://pastebin.com/Xf3hSGL7

https://i.imgur.com/e5gGvhT.png

С Jit все участки кода будут, примерно, одинаково обрабатываться

Snegovik1337
16.02.2018, 21:18
https://image.prntscr.com/image/R66c1AYaQiuXqzRSiQW4RA.png
Сделал так, результат другой

DeimoS
16.02.2018, 21:27
https://image.prntscr.com/image/R66c1AYaQiuXqzRSiQW4RA.png
Сделал так, результат другой

Так а ты не забыл поменять местами имена?)

new const code_snippets_names[3][] =
{
{"Snegovik1337"},
{"DeimoS"},
{"Long-"}
};

https://i.imgur.com/fxyKY6u.png

Snegovik1337
16.02.2018, 22:32
Так а ты не забыл поменять местами имена?)

new const code_snippets_names[3][] =
{
{"Snegovik1337"},
{"DeimoS"},
{"Long-"}
};

https://i.imgur.com/fxyKY6u.png

Да вроде нет)

DeimoS
16.02.2018, 22:45
Да вроде нет)

Ну значит ты пользуешься магией вне Хогвартса, раз у меня изменения, произведённые тобой, не изменили показатели :)

Snegovik1337
17.02.2018, 00:09
Наверно и вправду магия
https://image.prntscr.com/image/HqaifodmS1SA8-WAPQ0dgw.png
https://image.prntscr.com/image/I4Q4xf8USNu7gAWPZsZOGA.png

ziggi
17.02.2018, 09:29
https://pastebin.com/Xf3hSGL7

https://i.imgur.com/e5gGvhT.png

С Jit все участки кода будут, примерно, одинаково обрабатываться

Код, кстати, не компилится на компиляторе 3.10.6

https://pastebin.com/h1tmkZpi
Заменил strlen на sizeof, вариант со strlen медленнее на 30-40%. В данном случае скинов у каждого пола по 2, поэтому всё норм.

https://i.imgur.com/9RiuKTo.png
https://i.imgur.com/cMC0WMB.png
https://i.imgur.com/KAhPn4X.png
https://i.imgur.com/I0Z3HVE.png

DeimoS
17.02.2018, 10:02
Код, кстати, не компилится на компиляторе 3.10.6

https://pastebin.com/h1tmkZpi
Заменил strlen на sizeof, вариант со strlen медленнее на 30-40%. В данном случае скинов у каждого пола по 2, поэтому всё норм.

https://i.imgur.com/9RiuKTo.png
https://i.imgur.com/cMC0WMB.png
https://i.imgur.com/KAhPn4X.png
https://i.imgur.com/I0Z3HVE.png

Забавно, что без каких-либо изменений в коде результаты у меня прямо противоположные
https://i.imgur.com/WWdEvq2.png

Видимо, особенности процессора или ещё что

- - - Добавлено - - -


Код, кстати, не компилится на компиляторе 3.10.6

Нашел причину. Препроцессор криво обрабатывает перенос строки в макросах. А именно, не ставит пробел на месте переноса, из-за чего вот такой код

#define test(%0)\
print(%0)
Для него становится таким макросом

test(%0)print(%0)

Если поставить пробел между ")" и "\" - всё станет работать нормально.
Отпишите на github, кому не трудно и кто в ладах с английским

ziggi
17.02.2018, 12:06
Забавно, что без каких-либо изменений в коде результаты у меня прямо противоположные
https://i.imgur.com/WWdEvq2.png

Видимо, особенности процессора или ещё что


Какой процессор и компилятор? Я тестил на i5-7500 со стандартным компилятором.

Snegovik1337
17.02.2018, 12:22
AMD A6-3400M APU with Redeon(tm) HD Graphics 1.40 GHz
https://image.prntscr.com/image/cETe899_SBa0N98WqpGXPg.png
https://image.prntscr.com/image/A_5UkkjxRDyJaB1dxOvAuQ.png
https://image.prntscr.com/image/Y0Jp80sKQKaWtDmrOHdFtQ.png

ziggi
17.02.2018, 12:37
AMD A6-3400M APU with Redeon(tm) HD Graphics 1.40 GHz
https://image.prntscr.com/image/cETe899_SBa0N98WqpGXPg.png
https://image.prntscr.com/image/A_5UkkjxRDyJaB1dxOvAuQ.png
https://image.prntscr.com/image/Y0Jp80sKQKaWtDmrOHdFtQ.png

Кстати, ещё дело может быть в памяти, у меня довольно быстрая - DDR4 2400 МГц, а AMD A6-3400M работает на DDR3 1333 МГц.

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

Long-
17.02.2018, 12:42
Тогда сделайте мой код таким .
А то отстаю капец :mamba: xD


case D_REG_SEX:
{
if(!response)
return Kick(playerid);

pInfo[playerid][Sex] = listitem + 1;

if(lisitem == 1)
pInfo[playerid][Skin] = Random_Skin_Male[random(sizeof(Random_Skin_Male))];
else
pInfo[playerid][Skin] = Random_Skin_Female[random(sizeof(Random_Skin_Female))];

CreateNewAccount(playerid);
return true;
}

DeimoS
17.02.2018, 13:27
Какой процессор и компилятор? Я тестил на i5-7400 со стандартным компилятором.

Intel Core i5-3337U @ 1.80GHz
Компилятор и стандартный, и 3.10.6 использовал

ziggi
17.02.2018, 13:30
Intel Core i5-3337U @ 1.80GHz
Компилятор и стандартный, и 3.10.6 использовал

Тоже DDR3, думаю в этом дело.


Тогда сделайте мой код таким .
А то отстаю капец :mamba: xD


case D_REG_SEX:
{
if(!response)
return Kick(playerid);

pInfo[playerid][Sex] = listitem + 1;

if(lisitem == 1)
pInfo[playerid][Skin] = Random_Skin_Male[random(sizeof(Random_Skin_Male))];

pInfo[playerid][Skin] = Random_Skin_Female[random(sizeof(Random_Skin_Female))];

CreateNewAccount(playerid);
return true;
}

Дак этот код некорректный, скин всегда будет женским.

Snegovik1337
17.02.2018, 13:39
Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz 3.20 HGz
https://image.prntscr.com/image/V4_o_rebRsCTdX86qUuRIA.png
https://image.prntscr.com/image/wQoSfg9QSOKoNLXBgGibWA.png
https://image.prntscr.com/image/JI25KtxPSz20K_lyQ1bigQ.png

Long-
18.02.2018, 00:05
Тоже DDR3, думаю в этом дело.



Дак этот код некорректный, скин всегда будет женским.

ой, исправил