Оптимизация кода
|
|
Ghost-X | Дата: Понедельник, 02.05.2011, 20:55 | Сообщение # 16 |
Мастер джэдай
Группа:
Продвинутые
Сообщений: 3548
Награды: 36
Город: Наб. Челны
Репутация: 856
Замечания: 40%
Статус:
| Quote (Eakwarp) оветую переписать весь фак, без использования неправильных примеров. И все писать здесь, а не ссылаться на левый форум. Потому что ФАК юзается здесь, а не там. Ок-ок?
Спор на форуме, все равно что олимпиада среди умственно отсталых: даже если ты победил, ты все равно гермофродит. Хочешь остаться при своем мнении - держи его при себе.
|
|
|
|
Goshik | Дата: Понедельник, 02.05.2011, 21:40 | Сообщение # 17 |
Уверенный в себе
Группа:
Пользователи
Сообщений: 280
Награды: 1
Город: ---
Репутация: 18
Замечания: 60%
Статус:
| Quote (Fus1) Goshik, запуститься то он запустить , ну должен по крайне мере неа, я тоже думал что запустится) а оказывается не запускается, просто ложится сервер сразу Quote (Ghost-X) 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; разве убрав скобки скорось работы увеличится?
|
|
|
|
Impereal | Дата: Понедельник, 02.05.2011, 21:50 | Сообщение # 18 |
Мастер джэдай
Группа:
I'm V.I.P.
Сообщений: 2677
Награды: 51
Город: Санкт-Петербург
| Quote (Goshik) разве убрав скобки скорось работы увеличится? Врят ли,но код будет удобнее и без лишего.
Прощай самп-рус =Р
|
|
|
|
Dima-kun | Дата: Понедельник, 02.05.2011, 22:03 | Сообщение # 19 |
Группа:
Разработчики
Сообщений: 6269
Награды: 72
Репутация: 3512
Замечания: 0%
Статус:
| Goshik, нет не увеличится. А даже может чуть уменьшится как не странно Code #include <a_samp> forward test(); public OnGameModeInit() { SetTimer("test",1000,1); return 1; }
public test() { new count = GetTickCount(); if(GetMaxPlayers()==50) { print("50"); } else if(GetMaxPlayers()==500) { print("500"); } printf("if-else{} %i", GetTickCount() - count); count = GetTickCount(); if(GetMaxPlayers()==50)print("50"); else if(GetMaxPlayers()==500)print("500"); printf("if-else %i", GetTickCount() - count); } Code [22:01:57] if-else{} 0 [22:01:57] 500 [22:01:57] if-else 1
Мои работы: [INC] Сборник d_includes [LAST],[FS] New Demage Effect,[FS]Авто-Поворотники, [FS]mp3player,[FS] Fun Chat Game,[FS] Car Buy Syst,[FS] Anti-AirBrk,[INC] d_setpos, [GM] Game Move v0.1,[FS+include]Super-Armour [0.3z],[FS + Include] Multi Checkpoints
|
|
|
|
ZiGGi | Дата: Понедельник, 02.05.2011, 22:12 | Сообщение # 20 |
Мастер джэдай
Группа:
Продвинутые
Сообщений: 2652
Награды: 34
Город: St. Petersburg
Репутация: 2102
Замечания: 20%
Статус:
| Quote (Impereal) Сейчас ещё вспомнил частую ошибку,которую постоянно видел: Code if(PlayerAdmin[playerid] > 0){} else if(PlayerAdmin[playerid] == 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");} Зачем делать условие при прохождение котрого,ничего не пройзойдет - это глупо! Правильный пример: Code if(PlayerAdmin[playerid] == 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");} эмм, ващето не ==, а <= ... т.е. if(PlayerAdmin[playerid] <= 0){SendClientMessage(playerid,COLOR_WHITE,"Вы не админ!");} Quote (Morino_Reigan) нет не увеличится. А даже может чуть увеличится как не странно на скорость работы скобки вообще не влияют, а в тиках есть погрешность... Quote (toneysix) GetMaxPlayers - 1315ms (для справки я выставил всего 200 слотов) Просто 500 игроков - 311ms оптимизировал твой цикл с getmaxplayers(http://pastebin.com/Qu9uvD9X) Результат: getmaxplayers - 353 MAX_PLAYERS - 857 также, при 200 игроках в идеале, можно и без foreach обойтись, просто записывая самый большой ид игрока в переменную...
Бложе [indent]Мой блог Уроки по Pawn[/indent]
Open-GTO [indent]Блог разработчиков GitHub: https://github.com/Open-GTO/Open-GTO Сборки мода с сервером тут[/indent]
Сообщение отредактировал ZZiGGi - Понедельник, 02.05.2011, 22:13 |
|
|
|
toneysix | Дата: Понедельник, 02.05.2011, 22:22 | Сообщение # 21 |
Джэдай
Группа:
I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
| ZZiGGi это вообще-то не мой код ; ) Здесь уже таким образом поправили товарища. Morino_Reigan ну ты и проверяешь)
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
|
|
|
|
Goshik | Дата: Понедельник, 02.05.2011, 22:38 | Сообщение # 22 |
Уверенный в себе
Группа:
Пользователи
Сообщений: 280
Награды: 1
Город: ---
Репутация: 18
Замечания: 60%
Статус:
| Code
stock MaxPlayers;
public OnPlayerConnect(playerid) { if(playerid > MaxPlayers) MaxPlayers = playerid; return 1; }
public OnPlayerDisconnect(playerid) { if(playerid == MaxPlayers) { for(new i = MaxPlayers - 1; i > 0; i--) { if(!IsPlayerConnected(i)) continue; MaxPlayers = i; break; } } return 1; } вот так наверно будет лучше всего циклы делать... вроде правильно всё
|
|
|
|
toneysix | Дата: Понедельник, 02.05.2011, 22:44 | Сообщение # 23 |
Джэдай
Группа:
I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
| Goshik ерунда, просто будет определять наивысший слот, а если игроки будут уходить например под 10-ым айди, а 200 игрок будет в игре? Компенсируется и двойне. К тому же у тебя нулевой игрок не включен. for(new i = MaxPlayers - 1; i >= 0; i--)
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Сообщение отредактировал toneysix - Понедельник, 02.05.2011, 22:46 |
|
|
|
Goshik | Дата: Понедельник, 02.05.2011, 22:45 | Сообщение # 24 |
Уверенный в себе
Группа:
Пользователи
Сообщений: 280
Награды: 1
Город: ---
Репутация: 18
Замечания: 60%
Статус:
| toneysix, а если под 200 выйдет а под 10 останется?)
|
|
|
|
Crazyz | Дата: Понедельник, 02.05.2011, 22:47 | Сообщение # 25 |
Местный
Группа:
Продвинутые
Сообщений: 704
Награды: 70
Город: что?
Репутация: 334
Замечания: 60%
Статус:
| Полезный урок для новичков,у меня код давно оптимизирован!
|
|
|
|
toneysix | Дата: Понедельник, 02.05.2011, 22:47 | Сообщение # 26 |
Джэдай
Группа:
I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
| Goshik до него ещё будет 199 и 198 и прочее. Не выход. Твои условия компенсируются вдвойне и не будет никакой оптимизации.
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
|
|
|
|
Eakwarp | Дата: Понедельник, 02.05.2011, 23:07 | Сообщение # 27 |
Мастер джэдай
Группа:
Продвинутые
Сообщений: 4874
Награды: 179
Город: Москва
Репутация: 2543
Замечания: 60%
Статус:
| toneysix, использование последнего ида - не рационально. Ибо вполне возможно что до него игроков не будет, а циклу придется их посчитать.
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. Дорого.
|
|
|
|
AirKite | Дата: Понедельник, 02.05.2011, 23:24 | Сообщение # 28 |
Долгожитель
Группа:
I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
| Quote (toneysix) Увы, но с GetMaxPlayers() за счет вызова функции далеко не лучший вариант. Ну вообще с вариантом GetMaxPlayers() логично было бы работать в OnGameModeInit() один раз и всё. Мои результаты: getmaxplayers - 413 (200 слотов) MAX_PLAYERS - 920 foreach - 2 (Отличный результат, пока). new Iterator:MyIterator<500>; for(new t; t < 500; t++) Iter_Add(MyIterator, t); правим foreach с Player на MyIterator Результат: getmaxplayers - 419 MAX_PLAYERS - 978 foreach - 1309 Code new Iterator:MyIterator<500>;
new count = GetTickCount(); new MAX_PL=GetMaxPlayers(); for(new t; t < 10000; t++) for(new i; i < MAX_PL; i++) if(IsPlayerConnected(i)) continue; printf("getmaxplayers - %d", GetTickCount()-count);
count = GetTickCount(); for(new t; t < 10000; t++) for(new i; i < 500; i++) if(IsPlayerConnected(i)) continue; printf("MAX_PLAYERS - %d", GetTickCount()-count); for(new t; t < 500; t++) Iter_Add(MyIterator, t); count = GetTickCount(); for(new t; t < 10000; t++) foreach(MyIterator, i) if(IsPlayerConnected(i)) continue;
printf("foreach - %d", GetTickCount()-count); Не бывает магических иклудов способных реально сократить время выполнения операций. (Я имею ввиду тех, у которых и так логика проста). foreach сам по себе забирает время под вычисления при OnPlayerConnect и Disconnect.
[1337GAMES] Easy RP (SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)
Jabber: airkite@qip.ru [Addon] QuickBinder [FS] Online Players Record
|
|
|
|
AirKite | Дата: Понедельник, 02.05.2011, 23:37 | Сообщение # 29 |
Долгожитель
Группа:
I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
| Просто выходи так, что боремся за эти 0.04-0.08ms жертвуя 0.5-1ms при каждом подключении отключении игрока. Это я про foreach.
[1337GAMES] Easy RP (SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)
Jabber: airkite@qip.ru [Addon] QuickBinder [FS] Online Players Record
Сообщение отредактировал AirKite - Понедельник, 02.05.2011, 23:38 |
|
|
|
Dima-kun | Дата: Понедельник, 02.05.2011, 23:40 | Сообщение # 30 |
Группа:
Разработчики
Сообщений: 6269
Награды: 72
Репутация: 3512
Замечания: 0%
Статус:
| Quote (toneysix) Morino_Reigan ну ты и проверяешь) НУ может я не совсем доконца понял функцию GetTickCount. Ну хз. Мб я не до конца разобрался в этой функции
Мои работы: [INC] Сборник d_includes [LAST],[FS] New Demage Effect,[FS]Авто-Поворотники, [FS]mp3player,[FS] Fun Chat Game,[FS] Car Buy Syst,[FS] Anti-AirBrk,[INC] d_setpos, [GM] Game Move v0.1,[FS+include]Super-Armour [0.3z],[FS + Include] Multi Checkpoints
|
|
|
|