Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Страница 1 из 3 123 ПоследняяПоследняя
Показано с 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
    Репутация:
    15 ±
    Я предпочитаю использовать 1 способ. Кажется, он лучше :)

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

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

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

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    161
    Репутация:
    243 ±
    Итак, подсчитаем:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Вы, кажется, кое-чего не поняли... Усложняет код не его размер, а число вычислений, которые нужно сделать серверу при обработке кода.
    А оптимизация бывает разная. Например, в первом варианте вы "оптимизировали" код тем, что сняли с себя обязанность подсчитывать размер строки. При этом вы заставили это делать препроцессор, что увеличит время компиляции (незначительно, но всё же). И чтоб знать то, какой из параметров вы урезаете взамен оптимизации другого/их параметров - нужно знать теорию. Например то, что такое препроцессор и что он делает.
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от 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); 

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    26.03.2013
    Адрес
    Pro-Pawn.Ru
    Сообщений
    3,428
    Репутация:
    1079 ±
    Цитата Сообщение от 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,282
    Репутация:
    417 ±
    Вы меня все обижаете (((

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

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

 

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

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

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

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

Ваши права

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