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

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 1 из 1
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,662
    Репутация:
    2145 ±

    Мифы о Pawn-скриптинге - #7

    Внимание: данная тема закрыта для защиты от копирования.
    Если есть какие-то вопросы, замечания или просто пожелания по поводу данного урока - оставляйте их здесь.


    Миф 7: "В Pawn лучше всегда использовать нативные функции."

    Статус: Опровергнут.

    Описание:
    Есть такие уникумы, которые думают, якобы нативные функции всегда работают быстрее, чем аналогичный код на Pawn и поэтому лучше всегда использовать нативные функции.
    На самом деле это предположние верно не во всех случаях. Сам по себе вызов нативной функции - сравнительно затратная операция, т.к. нужно лишний раз копировать параметры функции (из стека виртуальной машины в массив параметров для вызываемой функции - вспомните, как выглядят заголовки функций в плагинах для SA:MP), передать управление из виртуальной машины на нативный код, выполнить код функции и перейти обратно в виртуальную машину.
    Собственно, выигрыш в использовании нативной функции зависит от сложности самой функции. У некоторых простых функций быстродействия может не хватить на компенсацию временных затрат на парсинг параметров и переход на нативный код и обратно.
    Примеры таких функций: clamp, min, max, tolower, toupper, strfind.

    Доказательство:
      Открыть/закрыть
    Многие нативные функции предназначены для того, чего нельзя или очень сложно сделать другими средствами.
    Лишь некоторые нативные функции можно заменить эквивалентным кодом на Pawn - обычно это функции для работы с целыми числами и строковые функции.
    Рассмотрим это на примере двух алгоритмов преобразования всех символов верхнего регистра в строке на символы нижнего регистра.
    В одном алгоритме для преобразования будет использоваться функция tolower, а в другом - аналогичный код на Pawn.
    Для сравнения скорости выполнения каждого из алгоритмов воспользуемся профайлером.
    PHP код:
    /*======== Настройки =========================================================*/
    // Кол-во итераций в циклах.
    const PROFILER_ITERATIONS_MAJOR 10_000;
    const 
    PROFILER_ITERATIONS_MINOR 100;

    // Названия отрывков кода.
    new const code_snippets_names[2][] =
    {
        {
    "native function"},
        {
    "Pawn function"}
    };


    #include <core>

    LowerCase0(string[])
    {
        static 
    pos;
        for (
    pos = -1string[++pos] != '\0';)
            
    string[pos] = tolower(string[pos]);
    }

    LowerCase1(string[])
    {
        static 
    posc;
        for (
    pos 0; ; ++pos)
        {
            if (
    != (string[pos]))
            {
                if (
    'A')
                    continue;
                if (
    'Z' c)
                    continue;
                
    string[pos] = + ('a' 'A');
                continue;
            }
            break;
        }
    }


    #define Prerequisites();\
        
    static string[] = "ABCabcAABBCCaabbccXYZxyzXXYYZZxxyyzz";

    #define CodeSnippet0();\
        
    LowerCase0(string);

    #define CodeSnippet1();\
        
    LowerCase1(string);
    /*======== Конец настроек ====================================================*/ 
    Результаты:
    Код:
    Тестирование: <native function> vs <Pawn function>
    Режим: интерпретируемый, 10000x100 итераций.
    native function: 8001
    Pawn function: 2263
    Код:
    Тестирование: <native function> vs <Pawn function>
    Режим: с JIT-компиляцией, 10000x100 итераций.
    native function: 5072
    Pawn function: 213

    Ещё пример: определить из двух чисел то, которое больше.
    Для таких целей в Pawn есть нативная функция max, но можно сделать и свой код.
    PHP код:
    /*======== Настройки =========================================================*/
    // Кол-во итераций в циклах.
    const PROFILER_ITERATIONS_MAJOR 100_000;
    const 
    PROFILER_ITERATIONS_MINOR 1000;

    // Названия отрывков кода.
    new const code_snippets_names[2][] =
    {
        {
    "native function"},
        {
    "Pawn function"}
    };


    #include <core>

    new max_value;
    #pragma unused max_value

    #define Prerequisites();\
        
    new random(100), random(100);

    #define CodeSnippet0();\
        
    max_value max(ab);

    #define CodeSnippet1();\
        
    max_value = (a) ? a;
    /*======== Конец настроек ====================================================*/ 
    Результаты:
    Код:
    Тестирование: <native function> vs <Pawn function>
    Режим: интерпретируемый, 100000x1000 итераций.
    native function: 4564
    Pawn function: 3794
    Код:
    Тестирование: <native function> vs <Pawn function>
    Режим: с JIT-компиляцией, 100000x1000 итераций.
    native function: 3010
    Pawn function: 353
    В обоих приведённых выше примерах реализация на Pawn обходит по производительности нативные функции, причём с JIT преимущество кода на Pawn только увеличивается.
    Но бывают и случаи, когда код на Pawn работает быстрее нативной функции только при использовании JIT-компиляции.
    Рассмотрим ещё один пример: удалить из строки все пробелы.
    PHP код:
    /*======== Настройки =========================================================*/
    // Кол-во итераций в циклах.
    const PROFILER_ITERATIONS_MAJOR 10_000;
    const 
    PROFILER_ITERATIONS_MINOR 100;

    // Названия отрывков кода.
    new const code_snippets_names[2][] =
    {
        {
    "native function"},
        {
    "Pawn function"}
    };


    #include <string>

    RemoveSpaces0(string[])
    {
        static 
    pos;
        
    pos 0;
        while (
    strfind(string" "falsepos) != -1)
            
    strdel(stringpos, ++pos);
    }

    RemoveSpaces1(string[])
    {
        static 
    pospos2c;
        for (
    pos 0pos2 0;; ++pos)
        {
            switch (
    string[pos])
            {
                case 
    ' ': continue;
                case 
    '\0':
                {
                    
    string[pos2] = '\0';
                    return;
                }
            }
            
    string[pos2++] = c;
        }
    }


    #define Prerequisites();\
        
    static string[] =\
            
    "    AaBbCcDdEeFfGgHh IiJjKkLlMmNnOoPp   QqRrSsTtUuVvWwXx YyZz    ";

    #define CodeSnippet0();\
        
    RemoveSpaces0(string);

    #define CodeSnippet1();\
        
    RemoveSpaces1(string);
    /*======== Конец настроек ====================================================*/ 
    Результаты:
    Код:
    Тестирование: <native function> vs <Pawn function>
    Режим: интерпретируемый, 10000x100 итераций.
    native function: 1237
    Pawn function: 4601
    Код:
    Тестирование: <native function> vs <Pawn function>
    Режим: с JIT-компиляцией, 10000x100 итераций.
    native function: 1464
    Pawn function: 472
    Как видно по результатам, нативная функция работает в 3.7 раза быстрее кода на Pawn, но при включении JIT результаты меняются вплоть до наоборот: код на Pawn опережает нативную функцию в 3.1 раза.

    Вывод: во многих случаях, когда нативной функции можно найти аналогичный код на Pawn, лучше использовать такой аналог.
    Но всё же, если вы не уверены в факте прироста производительности, используйте профайлер.


    Специально для Pro-Pawn.ru
    Не разрешается копирование данной статьи на других ресурсах без разрешения автора.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  2. 8 пользователя(ей) сказали cпасибо:
    DeimoS (21.02.2016)Londlem (20.02.2016)Nurick (22.02.2016)Processing (24.02.2016)Profyan (20.02.2016)StevenH (06.03.2016)untonyst (20.02.2016)VVWVV (20.02.2016)
 

 

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

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

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

Ваши права

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