Это раздел "Уроки", чому б и не поизобретать-то?
Вид для печати
Это раздел "Уроки", чому б и не поизобретать-то?
Ну, это больше сарказм был, чем какое-то достоинство. Вообще новичкам рекомендую выпилить эти проверки, потому что тогда их во всех циклах придется ставить или макрос писать.
Новичкам стоит советовать foreach, который позволяет создавать свои итераторы без лишних заморочек (просто используя конкретные функции). Будет гораздо больше профита, если вы, например, сделаете отдельный итератор для авторизированных игроков и отдельный итератор для админов, а не будете пихать проверки в итератор всех игроков. Вы потратите чуть больше памяти, но выиграете в скорости.
лол, давно так использовал, но из-за незнания что так можно сделать с инклуидом foreach использовал метод
tracker1, потом узнал об этом способе ( когда уже начал что-то понимать )
получалось, что-то типо этого:
PHP код:
const max_online_admin = 50+1; // всегда +1 ячейка
new bust_admin[max_online_admin] = {-1,...};
new bust_admins;
#define aforeach(%0) for(new _i, %0=bust_admin[_i]; _i <bust_admins; %0=bust_admin[++_i])
stock Invites_Admin(playerid)
{
if(Admin_Level{playerid} == 0) return 1;
if(bust_admins > max_online_admin-1) return 1;
bust_admin[bust_admins++] = playerid;
for(new i;i<sizeof(CheatShow);i++){
TextDrawShowForPlayer(playerid, CheatShow[i]);
}
if(Admin_Level{playerid} < 7)
{
static login_adm[] = "<Alogin> %s[%d] авторизировался как модератор %i уровня";
new str[sizeof(login_adm)+(-2+MAX_PLAYER_NAME)+2];
format(str,sizeof(str),login_adm,PI[playerid][pName],playerid,Admin_Level{playerid});
SendAdmin(0xFFCC00FF,str);
}
else SendClientMessage(playerid,0xFFCC00FF,!"Вы успешно авторизовались как спец. администратор");
return 1;
}
stock Leave_Admin(playerid,reas = 0)
{
if(Admin_Level{playerid} == 0) return 1;
if(Admin_Level{playerid} < 7)
{
new str_leave_adm[10+MAX_PLAYER_NAME char];
strcat(str_leave_adm,!"<Alogin> ");
strcat(str_leave_adm,PI[playerid][pName]);
if(reas == 1) strcat(str_leave_adm,!" disconnect");
else strcat(str_leave_adm,!" unlogged");
SendAdmin(0xFFCC00FF,str_leave_adm);
}
else SendClientMessage(playerid,0xFFCC00FF,!"Вы вышли из под администрирования");
Admin_Level{playerid} = 0;
for(new i;i<sizeof(CheatShow);i++){
TextDrawHideForPlayer(playerid, CheatShow[i]);
}
for(new i=0;i<bust_admins;i++)
{
if(bust_admin[i] == playerid)
{
bust_admin[i] = bust_admin[--bust_admins];
bust_admin[bust_admins]=-1;
break;
}
}
return 1;
}
Ну вот а foreach хранит в себе всё то же самое, только в удобной обёртке, из-за чего и теряет пару лишних миллисекунд. Но если из-за них отказываться от foreach, то можете смело вообще от циклов отказываться, расписывая все итерации вручную, дабы сэкономить то время, что тратится на работу цикла (а это инициализация переменной + условие + действия с ней).
В Китае вас очень будут чтить за это
Обновил код и результаты теста скорости в уроке, удалил из теста плагин Vectorial (почему-то не получилось найти его на оффе; впрочем, он всё равно заранее был в безвыигрышном положении из-за оверхеда на вызов нативных функций).
На самом деле там нет и одной тысячной миллисекунды разницы.
(2723 - 2472) / 10000000 = 0,0000251 (мс)Цитата:
Код:Tracker1's foreach test
125 players connected
50-74 IDs Disconnected
Starting main cycle 10_000_000 times
Tracker1's foreach test DONE. Time: 2472 ms.
Y_Less's foreach test
125 players connected
50-74 IDs Disconnected
Starting main cycle 10_000_000 times
Y_Less's foreach test DONE. Time: 2723 ms.
И это только с JIT. Без JIT поделие Tracker1 работает почти в 2 раза медленнее foreach (см. 1-й пост).
Я говорил лишь для примера. Такие тесты уже проводили. Просто не помню где.
Да и не важно, была бы там разница в паре миллисекунд или в секунде, ибо инклуд даёт удобную оболочку, которая позволяет делать код проще и компактнее, что уменьшает риск допущения ошибки. Глупо пытаться выиграть в скорости там, где это не требуется. Особенно в ущерб простоты кода.
Вообще я бы советовал всем "аптимизаторам-3000" прочесть два этих поста с офф форума
Часть информации из них уже потеряла свою актуальность, ибо это пережитки 2010-ых, но общая мысль в них, как по мне, очень правильная. В своё время они "вправили" мне голову и я перестал тратить время на то, чтоб днями придумывать как выдачить из кода пару лишних миллисекунд.
Даже если и так, это выглядело как либо дезинформация, либо неосведомлённость. Пара миллисекунд в некоторых ситуациях всё же могут иметь значение, чего уж точно не скажешь о 25 наносекундах.
И на самом деле я даже не знаю, может быть стоит удалить эту статью? В ней едва объясняется принцип работы итераторов (а это кое-что посложнее просто добавления/удаления элементов из обычного массива), но при этом у новичков от неё может остаться ложное представление об оптимизации кода. В конце концов, неоптимизированный код - это плохо, но ещё больший грех - чрезмерная оптимизация в ущерб читаемости кода.