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

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    15
    Репутация:
    7 ±

    PVar vs Массив

    Всем привет. Дело было вечером, делать было нечего.
    Написал простенький скрипт, для сравнения скорости.
    Массив же быстрее PVar? На кой фиг его (PVar) тогда вообще использовать?
    Не раз натыкался на рекомендации, использовать PVar вместо массива, якобы быстрее работает.

    Цикл первый - массив. Цикл второй - PVar.

     Код скрипта
    PHP код:
    #include <a_samp>
    main() return true;
    new 
    pertest[MAX_PLAYERS], allinfo[3][2], allvs;
    public 
    OnGameModeInit() return vs();
    stock vs(){
        if(
    allvs 99) return true;
        
    allvs++;
        
    allinfo[2][0] = GetTickCount();
        for(new 
    i1i1 500000i1++) pertest[0] = 0;
        
    allinfo[1][0] = GetTickCount() - allinfo[2][0], allinfo[2][1] = GetTickCount();
        for(new 
    i2 0i2 500000i2 ++) SetPVarInt(0"i2"0);
        
    allinfo[1][1] = GetTickCount() - allinfo[2][1];
        if(
    allinfo[1][0] < allinfo[1][1]) printf("Цикл 1 выполнен за %d ms. Цикл 2 выполнен за %d ms | Цикл 1 быстрее %d ms."allinfo[1][0], allinfo[1][1], allinfo[1][1]-allinfo[1][0]), allinfo[0][0]++;
        else if(
    allinfo[1][0] > allinfo[1][1]) printf("Цикл 1 выполнен за %d ms. Цикл 2 выполнен за %d ms | Цикл 2 быстрее на %d ms."allinfo[1][0], allinfo[1][1], allinfo[1][0]-allinfo[1][1]), allinfo[0][1]++;
        else 
    printf("Цикл 1 выполнен за %d ms. Цикл 2 выполнен за %d ms | Скорость циклов равна."allinfo[1][0], allinfo[1][1]);
        return 
    printf("Score: Цикл 1: %d | Цикл 2: %d."allinfo[0][0], allinfo[0][1]), vs();


    Вопрос выделен красным цветом.
    Сток вызывает сам себя 100 раз, для теста.

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от BossArturKA Посмотреть сообщение
    Всем привет. Дело было вечером, делать было нечего.
    Написал простенький скрипт, для сравнения скорости.
    Массив же быстрее PVar? На кой фиг его (PVar) тогда вообще использовать?
    Не раз натыкался на рекомендации, использовать PVar вместо массива, якобы быстрее работает.
    В давние времена, когда SAMP был еще "маленький", он был рассчитан на 100 игроков, но прошло время, и SAMP вырос, и уже 500 игроков могли играть одновременно, а потом и 1000.
    Еще в SAMP'e была и есть константа MAX_PLAYERS, обозначающая - максимальное количество игроков, сначала она была равна 100, потом 500, и наконец 1000.
    Многие "скриптеры", создавали и создают массивы с использованием MAX_PLAYERS, лишь для хранения одиночных флагов (1, 0 и т.п.), когда MAX_PLAYERS была равна 100, это еще было терпимо, но сейчас, подобное использование массивов слишком затратно в плане потребления памяти.

    Как нам известно, 1 ячейка массива занимает 4 байта, рассчитаем потребление памяти на один массив:

    MAX_PLAYERS при:
    100 * 4 занимало памяти 400 байт;
    500 * 4 занимало памяти 2000 байт;
    1000 * 4 занимает памяти 4000 байт;


    А если на сервере играют, к примеру 100 человек, то остальные 900 ячеек массива, возможно, никогда не будут использованы, а это, не задействованные 3600 байт.

    В связи с этим, была создана Per-player variable system (сокращенно PVar), система персональных переменых, имеет ряд преимуществ, по сравнению со стандартными переменными:
    • Доступность из всех загруженных модов и фильтр скриптов, позволяет упростить модуляризацию кода.
    • Автоматическое удаление PVar'ов, когда игрок выходит с сервера, что позволяет не сбрасывать вручную переменные для следующего подключившегося игрока.
    • PVar'ы экономят память, не расходуя ее на элементы на не подключенных игроков.
    • Если даже PVar не был создан, при запросе он по-прежнему будет возвращать значение по умолчанию 0.
    • PVar'ы могут хранить очень большие строки используя динамически выделяемую память.


    К недостаткам, возможно, можно отнести скорость работы, но я считаю, что это не очень критично.

    Полное описание PVar можно прочесть тут https://wiki.sa-mp.com/wiki/Per-player_variable_system
    Последний раз редактировалось NewGreen; 13.10.2015 в 11:29. Причина: исправил опечатки, дополнил

  3. 2 пользователя(ей) сказали cпасибо:
    BossArturKA (13.10.2015) gangzone.ini (13.10.2015)
  4. #3
    Аватар для BossArturKA
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    15
    Репутация:
    7 ±
    NewGreen, в принципе это цитата с форума са-мп.сом.
    Вот интересный пункт,
    Если даже PVar не был создан, при запросе он по-прежнему будет возвращать значение по умолчанию 0.
    Но вот в чем дело, получается он так-же хранит значение 0 (Якобы не создан) для каждого игрока =).

  5. #4
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от BossArturKA Посмотреть сообщение
    NewGreen, в принципе это цитата с форума са-мп.сом.
    Вот интересный пункт, Но вот в чем дело, получается он так-же хранит значение 0 (Якобы не создан) для каждого игрока =).
    Возможно, это сделано для защиты, т.к. пусть лучше PVar'ы будут возвращать определенное значение, чем не определенное.
    Это можно сравнить с обращением к несуществующей ячейке массива, что приведет к выходу за границы массива, а PVar в этом случае вернет 0.

  6. Пользователь сказал cпасибо:
    BossArturKA (13.10.2015)
  7. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Возможно, это сделано для защиты, т.к. пусть лучше PVar'ы будут возвращать определенное значение, чем не определенное.
    Это можно сравнить с обращением к несуществующей ячейке массива, что приведет к выходу за границы массива, а PVar в этом случае вернет 0.
    Можно было сделать, как в GetPlayerHealth:
    PHP код:
    new Floathp;
    new 
    result GetPlayerHealth(playeridhp); 
    Здесь в случае, если игрок не подключен, в переменной result будет 0, в случае успешного выполнения - 1.
    Точно так же можно было с самого начала сделать в GetPVarInt. Выбор же в пользу неопределённости между 0 и несуществующим значением - не что иное, как показатель некомпетентности разработчика (Kalcor). Впрочем, для него это не первый раз, и далеко не последний.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. 3 пользователя(ей) сказали cпасибо:
    $continue$ (13.10.2015) BossArturKA (13.10.2015) Unreal (14.10.2015)
  9. #6
    Аватар для NewGreen
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Можно было сделать, как в GetPlayerHealth:
    PHP код:
    new Floathp;
    new 
    result GetPlayerHealth(playeridhp); 
    Здесь в случае, если игрок не подключен, в переменной result будет 0, в случае успешного выполнения - 1.
    Точно так же можно было с самого начала сделать в GetPVarInt. Выбор же в пользу неопределённости между 0 и несуществующим значением - не что иное, как показатель некомпетентности разработчика (Kalcor). Впрочем, для него это не первый раз, и далеко не последний.
    Увы, пока исходный код закрыт, мало что можно сделать.

  10. Пользователь сказал cпасибо:
    BossArturKA (13.10.2015)
  11. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Увы, пока исходный код закрыт, мало что можно сделать.
    Я и не предлагал ничего менять. Просто хотел сказать, что не нужно оправдывать быдлокодеров предположениями о какой-то мифической защите.
    Вывод очевиден: из куя проектировщик абсолютно никакой, ибо у него нет никаких чётких стандартов.

    Вот ещё пример: функции TextDrawCreate и CreatePlayerTextDraw - названия составлены совершенно по разному, легко запутаться. В то же время, функции TextDrawDestroy и PlayerTextDrawDestroy названы по одному принципу, что ещё больше вводит в заблуждение. Иногда такое ощущение, будто у куя раздвоение личности или под одним ником скрываются два совершенно разных человека.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. Пользователь сказал cпасибо:
    Unreal (14.10.2015)
  13. #8
    Аватар для BossArturKA
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.01.2014
    Сообщений
    15
    Репутация:
    7 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Я и не предлагал ничего менять. Просто хотел сказать, что не нужно оправдывать быдлокодеров предположениями о какой-то мифической защите.
    Вывод очевиден: из куя проектировщик абсолютно никакой, ибо у него нет никаких чётких стандартов.

    Вот ещё пример: функции TextDrawCreate и CreatePlayerTextDraw - названия составлены совершенно по разному, легко запутаться. В то же время, функции TextDrawDestroy и PlayerTextDrawDestroy названы по одному принципу, что ещё больше вводит в заблуждение. Иногда такое ощущение, будто у куя раздвоение личности или под одним ником скрываются два совершенно разных человека.
    Изменить "название" функции сейчас модно :D. Подцепил видимо.

 

 

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

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

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

Ваши права

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