Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 10 из 10
  1. #1
    Аватар для ALIT13
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.05.2014
    Сообщений
    346
    Репутация:
    2 ±

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

    Добрый день вот я парня заказал Оптимизацию мода
    у меня был вариант
    PHP код:
    CMD:mm playerid )
    {
    new 
    listitems[] = "\
    {1D8DCF}[1]{FFFFFF}. » Моя статистика\
    \n{1D8DCF}[2]{FFFFFF}. » Репорт\
    \n{1D8DCF}[3]{FFFFFF}. » Мои команды\
    \n{1D8DCF}[4]{FFFFFF}. » Личные настройки\
    \n{1D8DCF}[5]{FFFFFF}. » Мои Возможности\
    \n{1D8DCF}[6]{FFFFFF}. » Донат"
    ;
    new 
    lvlexp[80];
    new 
    level PInfo[playerid][pLevel];
    format(lvlexp,70,"Личное меню | Лвл: %d | WARN: ",level);
    ShowPlayerDialog(playerid71DIALOG_STYLE_LISTlvlexplistitems"Выбрать""Закрыть");
    return 
    true;

    А пользователь сменил на
    PHP код:
    #define MAX_MAIN 6
    new mainmenu[MAX_MAIN][14] =
    {
    "~ Моя статистика",
    "~ Репорт",
    "~ Мои команды",
    "~ Личные настройки",
    "~ Мои Возможности",
    "~ Донат",}

    PHP код:
    stock DialogMain(playerid)
    {
    new 
    mes[150];
    for(new 
    i;MAX_MAIN;i++)
    {
    format(mes,sizeof(mes),"{ffffff}%s%s\n",mes,mainme nu[i]);
    }
    SPD(playerid,64,DIALOG_STYLE_LIST,"{C7001B}Меню персонажа",mes,"Выбор","Отмена");
    return 
    true;

    Разница есть ?
    Последний раз редактировалось ALIT13; 11.01.2016 в 19:56. Причина: Восстановил пост.

  2. #2
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Как минимум, данную команду можно сделать более производительнее, но если говорить о данных вариантах, то в первом будет всегда вызываться новый массив (listitems), а после выполнения будет уничтожаться (хотя, можно было сделать с помощью static. Для того, чтобы данный массив заносился в сегмент с памятью). Использование цикла с функцией format (во втором варианте) — очень трагично (в идеале, можно было сделать отправку аргументов с помощью ассемблера, но это также трагично, ибо делать это не так уж просто). Если массив используется меньше двух раз, например, один, то его следует занести в блок с данной функцией (хотя, можно этого не делать).
    В обоих вариантах нет подсчёта форматируемой строки, т.е. берутся какие-то магические цифры (именно из-за них могут быть проблемы).

    Информация для ТС: Всю статическую информацию можно упаковывать.

    P.S.: пользователь, которые дал вам такую «оптимизированную» функцию — сам ничего не смыслит в программировании, ибо это не оптимизация (хотя, в кругу г-и его код сочтут за оптимизацию, что и отличает данный сайт от Pro-Pawn.Ru).


    Мой вариант:
      Открыть/закрыть
    PHP код:
    CMD:mm(playeridparams[])
    {
        static const
            
    listitems[] = !"{1D8DCF}[1]{FFFFFF}. » Моя статистика"\
                
    "\n{1D8DCF}[2]{FFFFFF}. » Репорт"\
                
    "\n{1D8DCF}[3]{FFFFFF}. » Мои команды"\
                
    "\n{1D8DCF}[4]{FFFFFF}. » Личные настройки"\
                
    "\n{1D8DCF}[5]{FFFFFF}. » Мои Возможности"\
                
    "\n{1D8DCF}[6]{FFFFFF}. » Донат";

        
    // ОШИБКА: Для того, чтобы функция strcat работала правильно, во второй аргумент требуется указывать строку.
        // static title[64 char] = !"Личное меню | Уровень: ";
        // strcat(title, PInfo[playerid][pLevel]);
        // Переработанный вариант
            
    static const title[] = "Личное меню | Уровень: %d";
            new 
    frmStr[sizeof title + (-2)];
            
    format(frmStrsizeof frmStrtitlePInfo[playerid][pLevel]);

            
    // Другой вариант (использование valstr). - Не рекомендуется.
            // static title[64 char] = !"Личное меню | Уровень: ";
            // new buff[3 char];
            // valstr(buff, PInfo[playerid][pLevel], true);
            // strcat(title, buff);
        
    return ShowPlayerDialog(playerid71DIALOG_STYLE_LIST,
            
    titlelistitems,
            !
    "Выбрать", !"Закрыть");

    Лимиты в SA:MP
    Последний раз редактировалось VVWVV; 11.01.2016 в 18:02. Причина: Добавил код.

  3. #3
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Я вообще так сделал бы.

    PHP код:
    COMMAND:mm(playeridparams[]) 

        static 
    body[] = !"\ 
        {1D8DCF}[1]{FFFFFF}. » Моя статистика\  
        \n{1D8DCF}[2]{FFFFFF}. » Репорт\  
        \n{1D8DCF}[3]{FFFFFF}. » Мои команды\  
        \n{1D8DCF}[4]{FFFFFF}. » Личные настройки\  
        \n{1D8DCF}[5]{FFFFFF}. » Мои Возможности\  
        \n{1D8DCF}[6]{FFFFFF}. » Донат"
    ;  

        static const 
    title[] = !"Личное меню | Лвл: %d"
        new 
    format_title[sizeof(title) + (-2) + 1]; 
        
    format(format_titlesizeof(format_title), titlePInfo[playerid][pLevel]); 
        
        
    ShowPlayerDialog(playerid71DIALOG_STYLE_LISTformat_titlebody, !"Выбрать", !"Закрыть");  
        return 
    1;

    Ваш вариант от части лучше, ну как по мне. Так как ваши массивы/переменные объявлены локально > из стэка при завершении работы команды они удалятся, но и при вызове снова воссаздадуться. Его же вариант - укоротить код и все, я называю это "оптимизация для глаз". Его массив будет висеть в стэке все время, а ведь он понадобится нам один раз. Да и овер раз форматировать текст, который вообще никак не изменяется - бред.
    Последний раз редактировалось Desulaid; 12.01.2016 в 00:53. Причина: кек))00

  4. #4
    Аватар для ALIT13
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.05.2014
    Сообщений
    346
    Репутация:
    2 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Как минимум, данную команду можно сделать более производительнее, но если говорить о данных вариантах, то в первом будет всегда вызываться новый массив (listitems), а после выполнения будет уничтожаться (хотя, можно было сделать с помощью static. Для того, чтобы данный массив заносился в сегмент с памятью). Использование цикла с функцией format (во втором варианте) — очень трагично (в идеале, можно было сделать отправку аргументов с помощью ассемблера, но это также трагично, ибо делать это не так уж просто). Если массив используется меньше двух раз, например, один, то его следует занести в блок с данной функцией (хотя, можно этого не делать).
    В обоих вариантах нет подсчёта форматируемой строки, т.е. берутся какие-то магические цифры (именно из-за них могут быть проблемы).

    Информация для ТС: Всю статическую информацию можно упаковывать.

    P.S.: пользователь, которые дал вам такую «оптимизированную» функцию — сам ничего не смыслит в программировании, ибо это не оптимизация (хотя, в кругу г-и его код сочтут за оптимизацию, что и отличает данный сайт от Pro-Pawn.Ru).
    напиши свой вариант

  5. #5
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от ALIT13 Посмотреть сообщение
    напиши свой вариант
    Обновил своё первое сообщение.

  6. #6
    Аватар для ALIT13
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.05.2014
    Сообщений
    346
    Репутация:
    2 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Я вообще так сделал бы.

    PHP код:
    COMMAND:mm(playeridparams[]) 

        static 
    body[] = "\ 
        {1D8DCF}[1]{FFFFFF}. » Моя статистика\  
        \n{1D8DCF}[2]{FFFFFF}. » Репорт\  
        \n{1D8DCF}[3]{FFFFFF}. » Мои команды\  
        \n{1D8DCF}[4]{FFFFFF}. » Личные настройки\  
        \n{1D8DCF}[5]{FFFFFF}. » Мои Возможности\  
        \n{1D8DCF}[6]{FFFFFF}. » Донат"
    ;  

        static const 
    title[] = "Личное меню | Лвл: %d"
        new 
    format_title[sizeof(title) + (-2) + 1]; 
        
    format(format_titlesizeof(format_title), titlePInfo[playerid][pLevel]); 
        
        
    ShowPlayerDialog(playerid71DIALOG_STYLE_LISTformat_titlebody"Выбрать""Закрыть");  
        return 
    1;

    Ваш вариант от части лучше, ну как по мне. Так как ваши массивы/переменные объявлены локально > из стэка при завершении работы команды они удалятся, но и при вызове снова воссаздадуться. Его же вариант - укоротить код и все, я называю это "оптимизация для глаз". Его массив будет висеть в стэке все время, а ведь он понадобится нам один раз. Да и овер раз форматировать текст, который вообще никак не изменяется - бред.
    Для чего 2 + 1
    new format_title[sizeof(title) + (-2) + 2 + 1];

  7. #7
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Его массив будет висеть в стэке все время, а ведь он понадобится нам один раз.
    Почему в стеке.Он объявлен глобально,не?



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  8. #8
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Код:
    strcat(title, PInfo[playerid][pLevel]);
    Мы не можем так сделать, так как strcat строки сцепляет, а тут строка и число. Да и static const не вариант, а массив title уж очень большой, я не думаю, что все 63 ячейки будут забиты (нули не в счет!), я бы предложил 25-26 ячеек.

    Цитата Сообщение от ALIT13 Посмотреть сообщение
    Для чего 2 + 1
    new format_title[sizeof(title) + (-2) + 2 + 1];
    -2 символа из строка - %d (это два символа, при форматировании они как одно целое)+ 2 цифры, которые заменят это место, ну и + 1 на нуль символ

    Цитата Сообщение от Profyan Посмотреть сообщение
    Почему в стеке.Он объявлен глобально,не?
    Дак массивы не удаляются, если глобально объявлены. Они будут все время занимать n-часть памяти.

  9. #9
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Мы не можем так сделать, так как strcat строки сцепляет, а тут строка и число. Да и static const не вариант, а массив title уж очень большой, я не думаю, что все 63 ячейки будут забиты (нули не в счет!), я бы предложил 25-26 ячеек.
    Не учёл. Использовал символ # для перевода в строку при тестировании; остаётся только метод с format (хотя, можно сделать с помощью valstr для перевода значения в строку).
    Не очень люблю магические цифры. Можно вычислить длину строки, как это сделал ты.

    А почему static const не вариант? Мы же не будем менять содержимое данного массива.

    Спасибо, что заметил мою ошибку.
    Последний раз редактировалось VVWVV; 12.01.2016 в 14:00.

  10. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Дак массивы не удаляются, если глобально объявлены. Они будут все время занимать n-часть памяти.
    Но не в стеке же, а в секции данных. В стеке обычно находятся локальные переменные, объявляемые в функциях с помощью ключевого слова new.

    P.S.: Оставил бы здесь свой вариант команды, но он во многом будет совпадать с вариантом VVWVV, разве что за исключением названий переменных.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. 3 пользователя(ей) сказали cпасибо:
    Desulaid (11.01.2016) Profyan (12.01.2016) VVWVV (11.01.2016)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •