Просмотр полной версии : [Вопрос] Оптимизация
Всем привет
Написал небольшой мод, хотел бы спросить у вас, неплоха ли оптимизация и читабелен ли код?
Pastebin - Клик (https://pastebin.com/jAPpq9Td)
P.S. Спасибо DeimoS )
$continue$
12.02.2018, 18:56
Не в том месте пытаешься искать, что оптимизировать. Оптимизируй алгоритмы, ищи слабые места в моде с помощью профайлера (http://forum.sa-mp.com/showthread.php?t=271129)
Не в том месте пытаешься искать, что оптимизировать. Оптимизируй алгоритмы, ищи слабые места в моде с помощью профайлера (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];
Есть еще и другие пункты, но для начала этого будет достаточно.
Код не соответствует мировым стандартам
Ну это слишком громко сказано :) Нет одного общего стандарта. Стандарты есть лишь у конкретных языков. И от языка к языку они варьируются, исходя из особенностей языков.
Так же, например, есть такая штука, как "Венгерская нотация (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, то приближенного к той теме.
Код не соответствует мировым стандартам, читаемость кода оставляет желать лучшего.
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];
Есть еще и другие пункты, но для начала этого будет достаточно.
Как по мне - это небольшой бред
Все и так понятно, зачем что-то еще переделывать?
Касаемо просьбы автора.
Первое, что бросилось в глаза - ошибки с вещественными аргументами (указание целых чисел там, где должно быть вещественное число)
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;
}
Пока всё
Ну это слишком громко сказано :) Нет одного общего стандарта. Стандарты есть лишь у конкретных языков. И от языка к языку они варьируются, исходя из особенностей языков.
Так же, например, есть такая штука, как "Венгерская нотация (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: Понял, исправлюсь )
[Урок] Препроцессор (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;
}
Вызывать регистрацию в 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
Вызывай регистрацию в OnPlayerRequestClass, иначе будет в 0.3DL так
https://image.prntscr.com/image/X37eBhknSnKV2jwSA0MRVA.png
Я не собираюсь пока что использовать, но ладно, в будущем возьму на заметке
Я не собираюсь пока что использовать, но ладно, в будущем возьму на заметке
Лучше сразу переписать и сделать правильно, дабы потом остальные системы, зависимые от регистрации, не развалились и не начали глючить :)
Лучше сразу переписать и сделать правильно, дабы потом остальные системы, зависимые от регистрации, не развалились и не начали глючить :)
У меня почему-то персонаж не спавнится, только после того как я нажму кнопку "spawn"
Хотя SpawnPlayer стоит в загрузке аккаунта
[Мануал] Обход стандартного выбора скина (скрыть кнопки "<<", ">>" и "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;
}
Вызывать регистрацию в 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 и операции сложения, сохранив, при этом, условие. Кода стало меньше, но лучше он не стал :(
Я бы сделал так:
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;
}
Я бы сделал так:
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)
Тоже стоит понимать, что ради компактности ты жертвуешь процессорным временем :)
Тут действует принцип "китайского кода (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 будет не нужен.
Лучше мужские и женские скины в одном массиве разместить, тогда switch/case будет не нужен.
Так в любом случае нужно ведь будет определить какой пол выбрал игрок. Это притянет за собой либо дополнительную переменную, либо обращение к pInfo. К этому всему ещё и операции по получению ID пола из listitem.
Или может я не понял что-то?)
Так в любом случае нужно ведь будет определить какой пол выбрал игрок. Это притянет за собой либо дополнительную переменную, либо обращение к 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;
}
Не знаю, быстрее это или нет, но для меня в первую очередь важна читаемость кода, что влечёт за собой уменьшение дублирования кода.
Ну и такой код более гибок, легче будет добавить новый пол (мало-ли).
Ну значит я правильно понял. Если я правильно представляю принципы, по которым будет обрабатываться сей код, то увы, тут будет больше действий.
И да, надо было сразу уточнить, что про быстродействие я начал говорить не с той целью, что нужно использовать мой вариант, ибо он быстрее, а пытался объяснить (только забыл предупредить об этом :D) на наглядном примере то, что часто оптимизация одного параметра (в данном случае читаемости) наносит "вред" другому параметру (в данном случае быстродействию). И всегда следует выбирать меньшее зло среди всех.
В данном случае, например, оптимизация читаемости (вариант Ziggi и Long-) будут вполне приемлемыми, ибо код вызывается не так часто + сама по себе разница по времени между двумя вариантами минимальна.
Вооот. Ваш кэп :pardon:
Не только читаемости, но и масштабируемости)
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-
// 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
Написано же, тест на скорость чей вариант быстрее
А исходный код теста увидеть можно?
Snegovik1337
16.02.2018, 19:51
https://pastebin.com/0ups9v9d
Один из вариантов открываешь, компилируешь и проверяешь результат, потом скрываешь, открываешь другой и так т.д.
Все сразу не стал сделать, ибо не корректно показывает
https://pastebin.com/Xf3hSGL7
https://i.imgur.com/e5gGvhT.png
С Jit все участки кода будут, примерно, одинаково обрабатываться
Snegovik1337
16.02.2018, 21:18
https://image.prntscr.com/image/R66c1AYaQiuXqzRSiQW4RA.png
Сделал так, результат другой
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
Да вроде нет)
Да вроде нет)
Ну значит ты пользуешься магией вне Хогвартса, раз у меня изменения, произведённые тобой, не изменили показатели :)
Snegovik1337
17.02.2018, 00:09
Наверно и вправду магия
https://image.prntscr.com/image/HqaifodmS1SA8-WAPQ0dgw.png
https://image.prntscr.com/image/I4Q4xf8USNu7gAWPZsZOGA.png
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
Код, кстати, не компилится на компиляторе 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, кому не трудно и кто в ладах с английским
Забавно, что без каких-либо изменений в коде результаты у меня прямо противоположные
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
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 МГц.
В общем, ещё один довод к тому, что об оптимизации таких мелочей лучше не беспокоиться и сделать упор на читаемость и масштабируемость, ибо многое зависит от архитектуры компьютера и, что быстрее сегодня, завтра, на новом сервере, может оказаться медленнее.
Тогда сделайте мой код таким .
А то отстаю капец :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;
}
Какой процессор и компилятор? Я тестил на i5-7400 со стандартным компилятором.
Intel Core i5-3337U @ 1.80GHz
Компилятор и стандартный, и 3.10.6 использовал
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
Тоже DDR3, думаю в этом дело.
Дак этот код некорректный, скин всегда будет женским.
ой, исправил
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot