Перейти к содержанию
#Storm

Оптимизация

Рекомендуемые сообщения

#Storm

И снова здравствуйте, форумчане...

Хотел узнать, что вообще нужно для оптимизации мода, какие советы будут?

Что именно можно оптимизировать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16Shadows

  1. Циклы с малым числом итераций и однозначными значениями при итерациях можно заменить прямым кодом. Меньше переменных - выше скорость.

    new Float:pickups[3][3] = {...};
    for(new i; i < 3; i++) CreatePickup(model, pickups[i][0], pickups[i][1], pickups[i][2]);
    

    Можно заменить на:

     

    CreatePickup(model, x, y, z);
    CreatePickup(model, x, y, z);
    CreatePickup(model, x, y, z);
    
  2. Использовать одну и ту же переменную несколько раз по возможности. Много раз видел, что под каждый кусок данных создают новую переменную. Например,

    new str1[10], str2[20];
    format(str1, sizeof(str1), "Пример 1");
    format(str2, sizeof(str2), "Пример номер 1");
    SendClientMessage(playerid, -1, str1);
    SendClientMessage(playerid, -1, str2);
    

    Очевидно, две переменных строки, которые в сумме составляют 30 символов (= 30 ячеек = 120 байт), можно заменить одной, ещё и уменьшив её длину:

     

    new str[15];
    format(str, sizeof(str), "Пример 1");
    SendClientMessage(playerid, -1, str);
    format(str, sizeof(str), "Пример номер 1");
    SendClientMessage(playerid, -1, str);
    

    В итоге одна переменная длиной в 15 символов (= 15 ячеек = 60 байт)

    Так можно сильно сэкономить память.

  3. Более редкий совет для Pawn, но актуальный в общем для программирования: пытаться решать задачи не рекурсивно, а итеративно:

    Можно возводить в степень рекурсией:

     

    stock power(base, pow)
    {
        if(pow == 1) return base;
        else return power(base, pow-1)*base;
    }
    

    Тогда при каждом вызове функции power будет создаваться копия переменных base и pow для работы с ними. Если нам нужно возвести число в 10000 степень, то памяти может не хватить. Задачу также можно решить итеративно:

     

    stock power(base, pow)
    {
        new result = base;
        for(new i; i < pow-1; i++) result*base;
        return result;
    }
    

    Памяти такое решение займёт гораздо меньше.

  4. По возможности работать с ссылками на переменные (экономить память):

    Не утверждаю, что это совет корректен для Pawn, но в общем пригодится

    stock Example(arg1, arg2, arg3)
    {
        return arg1*arg2*arg3;
    }
    

    Для работы функции, будут созданы три копии переменных, что займёт доп. 12 байт памяти. А можно передать переменные ссылкой:

     

    stock Example(&arg1, &arg2, &arg3)
    {
        return arg1*arg2*arg3;
    }
    

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

Изменено пользователем 16Shadows
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
#Storm

Так, хорошо... 

 

А как понизить рекурсию грамотно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16Shadows

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
#Storm
@16Shadows, можешь показать примеры уменьшения рекурсии?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16Shadows

Ну в описании пункта я оставил пример, а дальше уже ищите у себя в моде рекурсию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.