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

    Статус
    Оффлайн
    Регистрация
    11.09.2014
    Адрес
    Киров [43]
    Сообщений
    93
    Репутация:
    0 ±

    Использование стандартных функций

    Приветствую тебя, мой раб, у меня вопрос "Какое преимущество дает в использовании стандартный функций"
    Я слышал о том, что в использование стандартный функций отражается только на скорости и нагрузке. Бывают ли такие случаи, что стандарты не всегда быстрее? Как мне понят где лучше использовать стандарты, а где нет?
    Последний раз редактировалось DeimoS; 10.11.2014 в 02:02. Причина: Исправил опечатку :)
    Функция SetGameModeText определяет уникальность вашего мода :D (Evil School Boy)


    Иногда так хочется крикнуть: "Подручныый .." :с



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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Всё зависит от того, как написана сторонняя функция :) Если брать в пример какой-нибудь PlayerToPoint и IsPlayerInRangeOfPoint, то нативная (стандартная) функция быстрее, ибо первая реализована не очень. Но бывают случаи, когда сторонние функции работают в разы быстрее (стандартные функции ведь тоже люди писали. И писали их когда-то. За тот момент могли придумать какие-то новые реализации).
    Один из примеров: функция strlen и макрос isnull.
    Макрос выглядит так:
    PHP код:
    #define isnull(%1) ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1])))) 
    и скорость тут достигается тем, что в макросе сразу идёт проверка первой ячейки на нуль-символ (ели в первой ячейке записан нуль-символ, значит в массиве нет текста), а функцию надо ещё вызвать и только потом она проведёт какие-то действия внутри себя и вернёт результат.
    Сюда же можно приписать и командные процессоры, в которых поиск команд реализован лучше, что повышает скорость, нежели постоянный вызов strcmp.
    В общем, всё зависит от конкретной ситуации и знаний того, как реализована нативная функция (иначе придётся методом тыка писать код и тестировать).

    А проверить можно циклом на over1000000 итераций + записью значения GetTickCount до запуска цикла и "GetTickCount() - записанное значение" после выполнения цикла (полученное значение выводим в логи). Вот тут Стас давал готовый код хорошего теста. Просто в циклы "for(j=0; j<PROFILE_ITERS_MINOR; ++j)" нужно будет вставить свой код
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Я написал вот такую функцию для своего удобства
    PHP код:
    stock TestFunction()
    {
        
    #define NUMBER_TICKS 5
        #define NUMBER_TESTS 10
        #define NUMBER_ITERATIONS 1000000
        
    new ticks[NUMBER_TICKS],
            
    tmp_ticks,
            
    pijk;

        
    printf("\n------------------------------------------------------------\nTesting...\nЧисло итераций в основном цикле - %d\nЧисло повторений теста - %d\n\n"NUMBER_ITERATIONSNUMBER_TESTS);
        for(
    0NUMBER_TESTSp++)
        {
            for(
    0NUMBER_TICKSk++) ticks[k] = 0;
            for(
    0NUMBER_ITERATIONS; ++i)
            {
                
    //===================================
                
    tmp_ticks GetTickCount();
                for(
    0100; ++j)
                {
                    
    //Тут код первой функции
                
    }
                
    ticks[0] += GetTickCount()-tmp_ticks;
                
    //===================================
                //===================================
                
    tmp_ticks GetTickCount();
                for(
    0100; ++j)
                {
                    
    //Тут код второй функции
                
    }
                
    ticks[1] += GetTickCount()-tmp_ticks;
                
    //===================================
            
    }
            
    printf("Тест №:%d"p+1);
            
    printf("Первая функция: %d"ticks[0]);
            
    printf("Вторая функция: %d"ticks[1]);
            print(
    "\n");
        }
        print(
    "\n------------------------------------------------------------\n");

     Пояснение
    PHP код:
    stock TestFunction()
    {
        
    #define NUMBER_TICKS 2// Тут указывается число теструемых функций. То есть, если ты собираешься тестировать 10 функций одновременно, тут указываешь число 10
        #define NUMBER_TESTS 10// Тут указывается сколько раз повторять наш тест.
        #define NUMBER_ITERATIONS 1000000// Ну а тут указывается число итераций для основного цикла, который будет крутить циклы с тестируемыми функциями. Если тест длится очень долго, можно указать и меньшее значение. Предыдущий макрос, в котором указывается число повторений теста, создан именно для того, чтоб сделать тест более объективным.
        
    new ticks[NUMBER_TICKS],// Переменные, которые будем использовать в ходе теста.
            
    tmp_ticks,// Дабы тест был максимально объективен, создание всех переменных вынесли за тело теста (циклов)
            
    pijk;// Таким образом время, которое бы тратилось на создание этих переменных, не учитывается

        
    printf("\n------------------------------------------------------------\nTesting...\nЧисло итераций в основном цикле - %d\nЧисло повторений теста - %d\n\n"NUMBER_ITERATIONSNUMBER_TESTS);
        for(
    0NUMBER_TESTSp++)// Первый цикл, который отвечает за повтор всего теста
        
    {
            for(
    0NUMBER_TICKSk++) ticks[k] = 0;// Этот цикл обнуляет таймера для каждого нового теста
            
    for(0NUMBER_ITERATIONS; ++i)// Ну а этот цикл уже является тем, что отвечает за сам тест
            
    {// Далее выделены блоки, которые являются чем-то вроде отдельного куска теста. Если тестировать надо больше двух функций, просто скопируй любой блок, замени код внутри цикла и измени значение ticks в последней строке на +1 (дабы записывалось в новую ячейку, а не перезаписывало старую)
                //===================================
                
    tmp_ticks GetTickCount();
                for(
    0100; ++j)
                {
                    
    //Тут код первой функции
                
    }
                
    ticks[0] += GetTickCount()-tmp_ticks;
                
    //===================================
                //===================================
                
    tmp_ticks GetTickCount();
                for(
    0100; ++j)
                {
                    
    //Тут код второй функции
                
    }
                
    ticks[1] += GetTickCount()-tmp_ticks;
                
    //===================================
            
    }
            
    printf("Тест №:%d"p+1);
            
    printf("Первая функция: %d"ticks[0]);// Ну и при логировании значений не забывай прописывать правильные номера ячеек
            
    printf("Вторая функция: %d"ticks[1]);
            print(
    "\n");
        }
        print(
    "\n------------------------------------------------------------\n");




    Вот пример теста IsPlayerInRangeOfPoint и PlayerToPoint
     Код теста
    PHP код:
    main()
    {
        
    TestFunction();

    PHP код:
    stock TestFunction()
    {
        
    #define NUMBER_TICKS 2
        #define NUMBER_TESTS 10
        #define NUMBER_ITERATIONS 10
        
    new ticks[NUMBER_TICKS],
            
    tmp_ticks,
            
    pijtk;

        
    printf("\n------------------------------------------------------------\nTesting...\nЧисло итераций в основном цикле - %d\nЧисло повторений теста - %d\n\n"NUMBER_ITERATIONSNUMBER_TESTS);
        for(
    0NUMBER_TESTSp++)
        {
            for(
    0NUMBER_TICKSk++) ticks[k] = 0;
            for(
    0NUMBER_ITERATIONS; ++i)
            {
                
    tmp_ticks GetTickCount();
                for(
    0100; ++j)
                {
                    for(
    0MAX_PLAYERSt++) IsPlayerInRangeOfPoint(t20000);
                }
                
    ticks[0] += GetTickCount()-tmp_ticks;
                
    tmp_ticks GetTickCount();
                for(
    0100; ++j)
                {
                    for(
    0MAX_PLAYERSt++) PlayerToPoint(20t000);
                }
                
    ticks[1] += GetTickCount()-tmp_ticks;
            }
            
    printf("Тест №:%d"p+1);
            
    printf("IsPlayerInRangeOfPoint: %d"ticks[0]);
            
    printf("PlayerToPoint: %d"ticks[1]);
            print(
    "\n");
        }
        print(
    "\n------------------------------------------------------------\n");

    PHP код:
    stock PlayerToPoint(Float:radiplayeridFloat:xFloat:yFloat:z)
    {
        if(
    IsPlayerConnected(playerid))
        {
            new 
    Float:oldposxFloat:oldposyFloat:oldposz;
            new 
    Float:tempposxFloat:tempposyFloat:tempposz;
            
    GetPlayerPos(playeridoldposxoldposyoldposz);
            
    tempposx = (oldposx -x);
            
    tempposy = (oldposy -y);
            
    tempposz = (oldposz -z);
            if (((
    tempposx radi) && (tempposx > -radi)) && ((tempposy radi) && (tempposy > -radi)) && ((tempposz radi) && (tempposz > -radi)))
            {
                return 
    1;
            }
        }
        return 
    0;



    Тут я сделал 10 итераций для основного цикла потому, что внутри каждого блока запускается новый цикл на 500 итераций (MAX_PLAYERS == 500) и 500 миллионов итераций ждать придётся несколько минут :) Можно делать несколько тестов, меняя значение NUMBER_ITERATIONS, если хочешь на 100% удостовериться в том, что данные верны. В случае с данным тестом, если поставить больше 10, время будет относительно одинаковым.

     Результаты:
    PHP код:
    [06:30:16] ------------------------------------------------------------
    Testing...
    Число итераций в основном цикле 10
    Число повторений теста 
    10


    [06:30:18Тест №:1
    [06:30:18IsPlayerInRangeOfPoint987
    [06:30:18PlayerToPoint1000
    [06:30:18

    [
    06:30:20Тест №:2
    [06:30:20IsPlayerInRangeOfPoint905
    [06:30:20PlayerToPoint945
    [06:30:20

    [
    06:30:21Тест №:3
    [06:30:21IsPlayerInRangeOfPoint904
    [06:30:21PlayerToPoint947
    [06:30:21

    [
    06:30:23Тест №:4
    [06:30:23IsPlayerInRangeOfPoint901
    [06:30:23PlayerToPoint960
    [06:30:23

    [
    06:30:25Тест №:5
    [06:30:25IsPlayerInRangeOfPoint909
    [06:30:25PlayerToPoint952
    [06:30:25

    [
    06:30:27Тест №:6
    [06:30:27IsPlayerInRangeOfPoint905
    [06:30:27PlayerToPoint965
    [06:30:27

    [
    06:30:29Тест №:7
    [06:30:29IsPlayerInRangeOfPoint955
    [06:30:29PlayerToPoint996
    [06:30:29

    [
    06:30:31Тест №:8
    [06:30:31IsPlayerInRangeOfPoint963
    [06:30:31PlayerToPoint1008
    [06:30:31

    [
    06:30:33Тест №:9
    [06:30:33IsPlayerInRangeOfPoint995
    [06:30:33PlayerToPoint1030
    [06:30:33

    [
    06:30:35Тест №:10
    [06:30:35IsPlayerInRangeOfPoint954
    [06:30:35PlayerToPoint1006
    [06:30:35

    [
    06:30:35] ------------------------------------------------------------ 
    Последний раз редактировалось DeimoS; 10.11.2014 в 03:34.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  5. 3 пользователя(ей) сказали cпасибо:
    #ball (10.11.2014) $continue$ (10.11.2014) Elaid (10.11.2014)
 

 

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

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

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

Ваши права

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