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

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Всё зависит от того, как написана сторонняя функция :) Если брать в пример какой-нибудь 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)" нужно будет вставить свой код
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Я написал вот такую функцию для своего удобства
    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.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

 

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

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

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

Ваши права

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