Оптимизация кода

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Какой вариант предпочтительней по вашему мнению?
1.
pawn Код:
new skin = GetPlayerSkin(playerid);
if(skin == 69) return 1;
if(skin+3 == 66) return 1;
SetPlayerSkin(playerid,skin+6);
return 1;
2.
pawn Код:
if(GetPlayerSkin(playerid) == 69) return 1;
if(GetPlayerSkin(playerid)+3 == 66) return 1;
SetPlayerSkin(playerid,GetPlayerSkin(playerid)+6);
return 1;
В скорости работе разницы думаю не будет. А так в первом варианте ты записываешь ид скина, а потом проверяешь и изменяешь его. Во втором варианте постоянно узнаешь ид скина.
Reply

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

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

Как вариант)
pawn Код:
test_skin(playerid)
{
    new skin = GetPlayerSkin(playerid);
    if(skin != 69 || skin+3 != 66) SetPlayerSkin(playerid, skin+6);
    return 1;
}
Reply

А написать skin != 63 мама или религия не позволяет?
Reply

Я вообще спрашивал не про то, как проверить. А про то, как лучше получить скин, сразу и потом использовать переменную. Или получать несколько раз в функции.
Reply

Quote:
Originally Posted by Urukhay
Посмотреть сообщение
Я вообще спрашивал не про то, как проверить. А про то, как лучше получить скин, сразу и потом использовать переменную. Или получать несколько раз в функции.
Есть стакан и есть ведро с водой, которое находится в 10 метрах от вас. Что легче: Один раз сходить и напиться или делать по маленькому глотку, но бегать каждую минуту до него?
Reply

pawn Код:
Test1()
{
    new v = GetPlayerSkin(0);
    if(v == 100) {}
    else if(v == 101) {}
}

Test2()
{
    if(GetPlayerSkin(0) == 100) {}
    else if(GetPlayerSkin(0) == 101) {}
}

main()
{
    new tick = GetTickCount();
    for(new i; i < 1000000; i++) {}
    new ltime = GetTickCount() - tick;
   
    tick = GetTickCount();
    for(new i; i < 1000000; i++) Test1();
    printf("Вариант с переменной: %d ms", GetTickCount() - tick - ltime);
   
    tick = GetTickCount();
    for(new i; i < 1000000; i++) Test2();
    printf("Вариант без переменной: %d ms", GetTickCount() - tick - ltime);
}
Имхо, стоит учитывать сложность самой функции. В разных ситуациях выигрыш будет разный.
Reply

Quote:
Originally Posted by Jon_De
View Post
у вас мод на файлах, о какой оптимизации речь?
как бы файловую систему никто не отменял
Reply

И вы считаете, что во всём виноват цикл? Уверены, что данные портятся именно при записи, а не где-то ранее?
Reply

Quote:
Originally Posted by Eims
View Post
И вы считаете, что во всём виноват цикл? Уверены, что данные портятся именно при записи, а не где-то ранее?
Еще есть сохранение домов, но там я уверен что все нормально
Reply

pawn Code:
for(new h = 0; h < sizeof(HouseInfo); h++)
{
    pickups ++;
    HouseInfo[h][hLabel] = Create3DTextLabel(text, 0xFFFFFFFF, HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez] + 1, 20.0, 0, 1);
    if(HouseInfo[h][hOwned] == 0)
    {
        format(text,sizeof(text),"{FFA500}Номер дома: {FFFFFF}[{FF0000}%d{FFFFFF}]\n{FFA500}Цена дома: {FFFFFF}[{FF0000}%d{FFFFFF}]\n{FFA500}Класс: {FFFFFF}[%s{FFFFFF}] \n{FFA500}Купить: {FFFFFF}[{FF0000}/buyhouse{FFFFFF}]",h,HouseInfo[h][hValue],classhouse);
        HouseInfo[h][hMIcon] = CreateDynamicMapIcon(HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez], 31, COLOR_WHITE, 0, -1, -1, 400.0);
        HouseInfo[h][hPickup] = CreatePickup(1273, 23, HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez], -1);
        continue;
    }
    format(text,sizeof(text),"{FFA500}Номер дома: {FFFFFF}[{FF0000}%d{FFFFFF}]\n{FFA500}Владелец дома: {FFFFFF}[{FF0000}%s{FFFFFF}] {FFFFFF}[%s{FFFFFF}]\n {FFA500}Класс: {FFFFFF}[{FF0000}%s{FFFFFF}]\n {FFFFFF}[%s{FFFFFF}]", h, HouseInfo[h][hOwner], ttextt, classhouse, lock22);
    HouseInfo[h][hMIcon] = CreateDynamicMapIcon(HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez], 32, COLOR_WHITE, 0, -1, -1, 400.0);
    HouseInfo[h][hPickup] = CreatePickup(1272, 23, HouseInfo[h][hEntrancex], HouseInfo[h][hEntrancey], HouseInfo[h][hEntrancez], -1);
}
На первый взгляд.
Reply

Сначала создать 3 д текст, а потом форматировать строку?
Reply

аххаха, подумаешь не доглядел)
Reply

Помогите исправить паблик сохранение домов, иногда все дома ставятся в одни координаты после сохранения
И я решил сделать вот такую проверку и когда цикл задействован то файлик property.cgf скачет т.е прыгает его размер например был 122кб стал 20, через 5 сек 50 и т.д пока не остановится цикл.
И наверное при сохранение домов он меняет кб и идет слет координат
Помогите решить трабл такой
PHP Code:
for(new i=0;i<MAX_PLAYERS;i++)
{
savehouses();

PHP Code:
stock savehouses()
{
    new 
Filefile2;
    new 
idx;
    
    while (
idx sizeof(HouseInfo))
    {
        new 
coordsstring[256];
        
format(coordsstringsizeof(coordsstring), "%f,%f,%f,%f,%f,%f,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%f,%f,%f,%f,%d,%d,%d\n",
        
HouseInfo[idx][hEntrancex],
        
HouseInfo[idx][hEntrancey],
        
HouseInfo[idx][hEntrancez],
        
HouseInfo[idx][hExitx],
        
HouseInfo[idx][hExity],
        
HouseInfo[idx][hExitz],
        
HouseInfo[idx][hOwner],
        
HouseInfo[idx][hValue],
        
HouseInfo[idx][hHel],
        
HouseInfo[idx][hInt],
        
HouseInfo[idx][hLock],
        
HouseInfo[idx][hOwned],
        
HouseInfo[idx][hTakings],
        
HouseInfo[idx][hVec],
        
HouseInfo[idx][hVcol1],
        
HouseInfo[idx][hVcol2],
        
HouseInfo[idx][hKlass],
        
HouseInfo[idx][hVehSost],
        
HouseInfo[idx][hCarx],
        
HouseInfo[idx][hCary],
        
HouseInfo[idx][hCarz],
        
HouseInfo[idx][hCarc]);
        if(
idx == 0)
        {
            
file2 fopen("property.cfg"io_write);
        }
        else
        {
            
file2 fopen("property.cfg"io_append);
        }
        
fwrite(file2coordsstring);
        
idx++;
        
fclose(file2);
    }

Reply

Quote:
Originally Posted by Kuroki
View Post
PHP Code:
for(new i=0;i<MAX_PLAYERS;i++)
{
savehouses();

Что по-вашему делает этот код?
Reply

Quote:
Originally Posted by stabker
View Post
Что по-вашему делает этот код?
выполняет 500тактов выхова паблика
Reply

Quote:
Originally Posted by Kuroki
View Post
выполняет 500тактов выхова паблика
Верно, тогда зачем вы 500 раз подряд сохраняете дома?
Reply

Quote:
Originally Posted by stabker
View Post
Верно, тогда зачем вы 500 раз подряд сохраняете дома?
я же говорю что проверял как сохраняются дома, получается при таком цикле файл меняет размер свой
Reply

Quote:
Originally Posted by Kuroki
View Post
я же говорю что проверял как сохраняются дома, получается при таком цикле файл меняет размер свой
А, извиняюсь, неправильно понял. Он меняет размер, т.к. много раз перезаписывается, в итоге примерно такой же получится.

Проблемы с сохранением наблюдаются когда выключаете и включаете сервер? Если да, то как именно вы его выключаете?
Reply

Quote:
Originally Posted by Jon_De
View Post
Сначала создать 3 д текст, а потом форматировать строку?
Косяк ) Даже не заметил. Тогда придётся либо в каждом условии ставить создание, либо убирать continue и добавлять else.
Reply


Forum Jump:


Users browsing this thread: 5 Guest(s)