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

    Статус
    Оффлайн
    Регистрация
    22.08.2014
    Сообщений
    32
    Репутация:
    22 ±

    Что будет эффективней?

    Пишу мод с 0, добрался до команд.
    Использую процессор DC_MD.
    Я как-то не прислушивался к теме "Обработка информации мода и его компиляция".
    Хотел разузнать у вас что, да как. Слышал от некоторых людей, что большой код влияет на скорость обработки информации, а также, на скорость компиляции мода.

    Ниже предоставлю пару примеров, оба рабочие.
    1й способ более оптимизирован, но занимает больше места, 2й же - меньше места.
    Учитывая, что если весь код мода будет написан с помощью подобных способов (1 способ), то будет ли он влиять на скорость обработки и компиляции мода?
    Прошу не оффтопить в теме. Еще раз повторяюсь, что я этот момент как-то пропустил мимо своих ушей, теперь задаюсь вопросами.

     1-й Способ
    PHP код:
    CMD:freeze(playeridparams[])
    {
        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
        
    extract params -> new player:getid; else return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");
        if(
    == IsPlayerConnected(getid)) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
        static const
            
    fmt_str1[] = "Администратор %s(%d) Вас заморозил.",
            
    fmt_str2[] = "Вы заморозили игрока %s(%d).";
        const
            
    fmt1_size sizeof(fmt_str1) - MAX_PLAYER_NAME 3,
            
    fmt2_size sizeof(fmt_str2) - MAX_PLAYER_NAME 3;
        
    #if fmt1_size > fmt2_size
        
    const size fmt1_size;
        
    #else
        
    const size fmt2_size;
        
    #endif
        
    new msg[size];
        
    format(msgsizeof(msg), fmt_str1Nick(playerid)), Message(getidCOLOR_REDmsg);
        
    format(msgsizeof(msg), fmt_str2Nick(getid)), Message(playeridCOLOR_REDmsg);
        return 
    TogglePlayerControllable(getidfalse);


     2-й Способ
    PHP код:
    new strcmd[144];
    CMD:freeze(playeridparams[])
    {
        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid));
        
    Message(params[0], COLOR_REDstrcmd);
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0]));
        
    Message(playeridCOLOR_REDstrcmd);
        return 
    TogglePlayerControllable(params[0], false);


  2. #2
    Аватар для Flime
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.06.2014
    Адрес
    Москва
    Сообщений
    92
    Репутация:
    16 ±
    Я предпочитаю использовать 1 способ. Кажется, он лучше :)

    - - - Добавлено - - -

    Главное - это не размер кода, а степень оптимизации.

  3. Пользователь сказал cпасибо:
    Rasta (26.08.2014)
  4. #3
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Итак, подсчитаем:
    1 вариант:
    Часто начал замечать такую дебильную тенденцию (в частности Про-Павн) максимально утруждать свой код и сваливать всю свою лень на препроцессор.
    PHP код:
    CMD:freeze(playeridparams[])
    {
        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
        
    extract params -> new player:getid; else return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");//-4 байта из стека
        
    if(== IsPlayerConnected(getid)) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
        static const
            
    fmt_str1[] = "Администратор %s(%d) Вас заморозил."// + 36*4=144 байта
            
    fmt_str2[] = "Вы заморозили игрока %s(%d)."// + 28*4=112 байта
        
    const
            
    fmt1_size sizeof(fmt_str1) - MAX_PLAYER_NAME 3// 36 - 2 + 24 - 2 + 3 = 59;
            
    fmt2_size sizeof(fmt_str2) - MAX_PLAYER_NAME 3// 28 - 2 + 24 - 2 + 3 = 51;
        #if fmt1_size > fmt2_size
        
    const size fmt1_size;
        
    #else
        
    const size fmt2_size;
        
    #endif
        
    new msg[size];// + 59 * 4 = 236;
        
    format(msgsizeof(msg), fmt_str1Nick(playerid)), Message(getidCOLOR_REDmsg);
        
    format(msgsizeof(msg), fmt_str2Nick(getid)), Message(playeridCOLOR_REDmsg);
        return 
    TogglePlayerControllable(getidfalse);
    //Итого 144 + 112 + 144 = 462 
    Итог: размер сегмента данных увеличится на 462 байтов, препроцессор выполнит ненужную проверку и ненужные расчёты, для некоторых код станет непонятным, увеличивается размер .pwn файла.
    2 вариант:
    PHP код:
    new strcmd[144]; // + 144 * 4 = 576 байтов 
    CMD:freeze(playeridparams[]) 

        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда."); 
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]"); 
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере."); 
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid)); 
        
    Message(params[0], COLOR_REDstrcmd); 
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0])); 
        
    Message(playeridCOLOR_REDstrcmd); 
        return 
    TogglePlayerControllable(params[0], false); 

    Итог: размер сегмента данных увеличится на 576 байтов.
    ОБЩИЙ ВЫВОД: Оба варианта плохи. Первый тем что он сам по себе вмещает ненужные препроцессорные проверки и расчёты (их легко может подсчитать сам скриптер - обычным калькулятором и такой удобной программкой как SimplePawn, которая подсчитывает размер форматируемеой строки), а второй тем что указан слишком большой размер массива, тем без всякого смысла теряется лишняя память из сегмента данных.
    IMO идеальный вариант:
    PHP код:
    CMD:freeze(playeridparams[])
    {
        new 
    strcmd[59];//Вместо потерянной памяти из сегмента данных используем стек, при этом теряем 0 байтов
        
    if(PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid));
        
    Message(params[0], COLOR_REDstrcmd);
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0]));
        
    Message(playeridCOLOR_REDstrcmd);
        return 
    TogglePlayerControllable(params[0], false);



    Цитата Сообщение от Flime Посмотреть сообщение
    Я предпочитаю использовать 1 способ. Кажется, он лучше :)
    Если код воспринимается труднее или соответствует какой-нибудь новой тенденции это не означает что он является лучше.
    Последний раз редактировалось ^_^; 26.08.2014 в 19:37.

  5. 2 пользователя(ей) сказали cпасибо:
    #ball (26.08.2014) Rasta (26.08.2014)
  6. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Вы, кажется, кое-чего не поняли... Усложняет код не его размер, а число вычислений, которые нужно сделать серверу при обработке кода.
    А оптимизация бывает разная. Например, в первом варианте вы "оптимизировали" код тем, что сняли с себя обязанность подсчитывать размер строки. При этом вы заставили это делать препроцессор, что увеличит время компиляции (незначительно, но всё же). И чтоб знать то, какой из параметров вы урезаете взамен оптимизации другого/их параметров - нужно знать теорию. Например то, что такое препроцессор и что он делает.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. Пользователь сказал cпасибо:
    Rasta (26.08.2014)
  8. #5
    Аватар для Rasta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.08.2014
    Сообщений
    32
    Репутация:
    22 ±
    DeimoS, если я Вас правильно понял, то сам оптимальным вариантом будет считаться 2-й приведенный вариант ^_^?

    PHP код:
    new strcmd[144]; // + 144 * 4 = 576 байтов 
    CMD:freeze(playeridparams[]) 

        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда."); 
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]"); 
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере."); 
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid)); 
        
    Message(params[0], COLOR_REDstrcmd); 
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0])); 
        
    Message(playeridCOLOR_REDstrcmd); 
        return 
    TogglePlayerControllable(params[0], false); 


  9. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Rasta Посмотреть сообщение
    DeimoS, если я Вас правильно понял, то сам оптимальным вариантом будет считаться 2-й приведенный вариант ^_^?

    PHP код:
    new strcmd[144]; // + 144 * 4 = 576 байтов 
    CMD:freeze(playeridparams[]) 

        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда."); 
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]"); 
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере."); 
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid)); 
        
    Message(params[0], COLOR_REDstrcmd); 
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0])); 
        
    Message(playeridCOLOR_REDstrcmd); 
        return 
    TogglePlayerControllable(params[0], false); 

    Нет. Третий. Там, где используется локальная переменная, использующая память стэка, а не глобальную.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. Пользователь сказал cпасибо:
    Rasta (26.08.2014)
  11. #7
    Аватар для Osetin
    •Администратор•

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    ♔Osetia, Vladikavkaz♔
    Сообщений
    3,432
    Репутация:
    1093 ±
    Цитата Сообщение от Rasta Посмотреть сообщение
    DeimoS, если я Вас правильно понял, то сам оптимальным вариантом будет считаться 2-й приведенный вариант ^_^?

    PHP код:
    new strcmd[144]; // + 144 * 4 = 576 байтов 
    CMD:freeze(playeridparams[]) 

        if(
    PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда."); 
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]"); 
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере."); 
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid)); 
        
    Message(params[0], COLOR_REDstrcmd); 
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0])); 
        
    Message(playeridCOLOR_REDstrcmd); 
        return 
    TogglePlayerControllable(params[0], false); 

    Вам уже скинули код:

    PHP код:
     CMD:freeze(playeridparams[])
    {
        new 
    strcmd[59];//Вместо потерянной памяти из сегмента данных используем стек, при этом теряем 0 байтов
        
    if(PInfo[playerid][pAdmin] < 1) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Вам недоступна данная команда.");
        else if(
    sscanf(params"i"params[0])) return Message(playeridCOLOR_GREEN,"(Используйте): {669966}/freeze [ID Player]");
        else if(!
    IsPlayerConnected(params[0])) return Message(playeridCOLOR_RED,"(Ошибка): {FF6666}Игрока нет на сервере.");
        
    format(strcmdsizeof(strcmd), "Администратор %s(%d) Вас заморозил."Nick(playerid));
        
    Message(params[0], COLOR_REDstrcmd);
        
    format(strcmdsizeof(strcmd), "Вы заморозили игрока %s(%d)."Nick(params[0]));
        
    Message(playeridCOLOR_REDstrcmd);
        return 
    TogglePlayerControllable(params[0], false);


  12. 2 пользователя(ей) сказали cпасибо:
    #ball (26.08.2014) Rasta (26.08.2014)
  13. #8
    Аватар для Rasta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.08.2014
    Сообщений
    32
    Репутация:
    22 ±
    Osetin, просто хотел убедится.
    Ну что же, всем спасибо за советы. Буду придерживаться такой структуры написания.
    Хотя, у меня совсем были другие предположения...

  14. #9
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Вы меня все обижаете (((

  15. #10
    Аватар для Rasta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.08.2014
    Сообщений
    32
    Репутация:
    22 ±
    Цитата Сообщение от Salvador Посмотреть сообщение
    Вы меня все обижаете (((
    Не понял...

 

 
Страница 1 из 3 1 2 3 ПоследняяПоследняя

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

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

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

Ваши права

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