Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 5 из 5 ПерваяПервая ... 3 4 5
Показано с 41 по 50 из 50
  1. #41
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Накидал тут свой тест производительности обычных переменных на Pawn и PVar'ов.
    PHP код:
    CMD:profile(playeridparams[])
    {
        const    
    PROFILE_ITERATIONS_MAJOR    10_000,
                
    PROFILE_ITERATIONS_MINOR    100;
        const 
    NUM_PVARS 100;
        static const 
    pvar_name_prefix[] = "pvar_%03d";
        static 
    pvar_name[sizeof(pvar_name_prefix) + (- 3)];
        static 
    arr[2], x;
        for (
    0NUM_PVARS; ++i)
        {
            
    format(pvar_namesizeof(pvar_name), pvar_name_prefixi);
            
    SetPVarInt(playeridpvar_name0);
        }
        static 
    xy;
        static 
    tt1t2t3t4;
        
    t1 0t2 0t3 0t4 0;
        for (
    PROFILE_ITERATIONS_MAJORi-- != 0; )
        {
            
    GetTickCount();
            for (
    PROFILE_ITERATIONS_MINORj-- != 0; )
                
    x;
            
    t1 += GetTickCount() - t;
            
    GetTickCount();
            for (
    PROFILE_ITERATIONS_MINORj-- != 0; )
                
    GetPVarInt(playeridpvar_name);
            
    t2 += GetTickCount() - t;
            
    GetTickCount();
            for (
    PROFILE_ITERATIONS_MINORj-- != 0; )
                
    42;
            
    t3 += GetTickCount() - t;
            
    GetTickCount();
            for (
    PROFILE_ITERATIONS_MINORj-- != 0; )
                
    SetPVarInt(playeridpvar_name42);
            
    t4 += GetTickCount() - t;
        }
        new 
    results_buf[128 1];
        new 
    jit_enabled;
        
    #emit    zero.pri
        #emit    lctrl        7
        #emit    stor.s.pri    jit_enabled
        
    format(results_bufsizeof(results_buf), "JIT: %s"jit_enabled ? ("on") : ("off"));
        print(
    results_buf);
        
    SendClientMessage(playerid, -1results_buf);
        
    format(results_bufsizeof(results_buf), "Total PVars: %d"NUM_PVARS);
        print(
    results_buf);
        
    SendClientMessage(playerid, -1results_buf);
        
    format(results_bufsizeof(results_buf), "Pawn variable get: %d"t1);
        print(
    results_buf);
        
    SendClientMessage(playerid, -1results_buf);
        
    format(results_bufsizeof(results_buf), "PVar get: %d"t2);
        print(
    results_buf);
        
    SendClientMessage(playerid, -1results_buf);
        
    format(results_bufsizeof(results_buf), "Pawn variable set: %d"t3);
        print(
    results_buf);
        
    SendClientMessage(playerid, -1results_buf);
        
    format(results_bufsizeof(results_buf), "PVar set: %d"t4);
        print(
    results_buf);
        
    SendClientMessage(playerid, -1results_buf);
        
    #emit load.pri y

    Код:
    JIT: off
    Total PVars: 1
    Pawn variable get: 85
    PVar get: 4152
    Pawn variable set: 91
    PVar set: 4100
    
    JIT: on
    Total PVars: 1
    Pawn variable get: 38
    PVar get: 4114
    Pawn variable set: 47
    PVar set: 4077
    
    JIT: off
    Total PVars: 20
    Pawn variable get: 95
    PVar get: 4427
    Pawn variable set: 73
    PVar set: 4353
    
    JIT: off
    Total PVars: 100
    Pawn variable get: 89
    PVar get: 5360
    Pawn variable set: 86
    PVar set: 5487
    В сравнении с тестом DeimoS'а разница куда большая. Возможно это из-за того, что в первом образце кода нет создания переменной в цикле. (Как можно было вообще додуматься так насиловать стек? Конечно, тогда обычная переменная будет "откликаться" медленнее.)
    Ещё один вариант: в предыдущем тесте для каждого отрывка используется цикл на миллион итераций. Скорее всего процессор просто помещает нужные блоки памяти из секций данных и кода в процессорный кэш, что и влияет на производительности. В реальных ситуациях такое вряд ли возможно.
    В моём же тесте используются вложенные циклы: 1-го уровня на 10 000 итераций и второго на 100. В результате получается тот же миллион итераций, но без побочных эффектов с кэшированием. Но про кэширование это лишь моя догадка.

    При включении JIT повышается быстродействие обычных переменных (что в принципе логично, JIT повышает производительность кода на Pawn, а не нативных функций).
    При увеличении кол-ва активных PVar'ов наоборот увеличивается время их отклика. На самом деле, для самого первого PVar'а время остаётся таким же, а для последующих оно увеличивается пропорционально с увеличением внутреннего ID.
    Иными словами, чем позднее создан PVar, тем больше время его отклика. Это происходит из-за того, что сервер совершает линейный поиск по всем слотам для PVar'ов в поисках слота с нужным именем.
    И да, если кто-то назовёт меня теоретиком, аргументируя, что в реальных проектах не используется так много PVar'ов - посмотрите сначала на исходники какого-нибудь крупного проекта (например, WCRP - там по какой-то странной причине PVar'ы используются практически для всего).

    Btw, упаковав массив, можно использовать вчетверо меньше памяти, при этом практически не жертвуя скоростью в сравнении с PVar. Что собственно и сделал автор темы.




    Цитата Сообщение от ziggi Посмотреть сообщение
    Видимо что-то изменилось, по крайней мере так было раньше:
    - "In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1" - источник
    - "В памяти компьютера значения констант и переменных типа bool занимают 4 байта." - источник
    Да, размер bool зависит от реализации (т.е. от компилятора или стандартной библиотеки)... как и всё остальное в C++ -__-

    Цитата Сообщение от ziggi Посмотреть сообщение
    - "Учтите, что тип BOOL в C имеет размер 4 байта (= sizeof(int)), а тип Boolean состоит только из одного." - источник
    Так это ж кастомный тип, который специфичен только для функций WIN32 API.

    Цитата Сообщение от ziggi Посмотреть сообщение
    По рукам ходят.
    В любом случае, исходники из Open SA-MP явно основаны на слитых исходниках от куя. Об этом можно судить, например, по наличии файлов с расширением ".cpp.orig" в дополнение к файлам с тем же именем, но расширением ".cpp" (например, "func_amx.cpp" и "func_amx.cpp.orig").
    Также в исходниках Pawn AMX присутствуют все модификации, которые были сделаны в рамках SA-MP: например, куй отключил опкоды "jump.pri" и "call.pri" (сделано из соображений "безопасности", если верить комментариям в коде).
    И да, в тех же исходниках Pawn AMX можно найти дату изменения (видимо, в SA-MP Team тоже пользовались утилитой svnrev, которой пользовался и разработчик Pawn):
    А вот что можно найти в amx.c: https://github.com/Sasuke78200/open-...mx/amx.c#L2096
    PHP код:
    op_call_pri:
        
    // Kye SA-MP Team 9/9/2009 Unsecure opcode
        //PUSH((unsigned char *)cip-code);
        //cip=(cell *)(code+(int)pri);
        //NEXT(cip);
        
    assert(0);
        
    ABORT(amx,AMX_ERR_INVINSTR); 
    "9/9/2009" - это позднее выхода 0.2x (20.11.2008) и раньше даты релиза 0.3a (19.10.2009), т.е. исходники либо от одной из предрелизных версий 0.3, либо от релиза 0.3a или более поздних версий.
    Как раз в одной из ревизий 0.3a добавили PVar'ы, так что в исходниках Open SA-MP они вряд ли являются результатом обратной разработки.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Какие другие случаи? pVar есть смысл использовать только тогда, когда какую-то информацию нужно хранить короткий промежуток времени. И даже если тебя так пугает случаи вызова pVar в цикле, в результате которой ты теряешь наносекунды, ты всегда можешь этот самый pVar записать в локальную переменную и использовать её.
    Могу, и, собственно, так и делаю как правило.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    А что бы ты писал, если бы не понял смысла, лол? Ты потому и не понял смысла, что не смог провести параллель между моими примерами и ситуацией.
    Так бы и написал. Да и было бы тут что понимать. Если тебе каждый раз объяснять, почему твоя параллель неуместна, клавиатура бы уже и загнулась. С теми же командными процессорами: команды нынче не столько используются, сколько использовались раньше по количеству, у многих на данный момент всё на диалогах/текстдравах, потому это не то направление, где уместна активная доработка прироста скорости.
    Тут же мы будем иметь действительно уйму систем, одной-то защитой обхода логина не ограничится.
    Я к тому, что команды - грубо говоря прошлый век, и гнаться за их производительностью уже смешно не потому, что за ней гонятся до такой степени, а потому, что они просто для многих перестают быть актуальной темой, всё необходимое уже в той области "изобретено".

    Цитата Сообщение от DeimoS Посмотреть сообщение
    То бишь, оптимизировать нужно только большие объёмы памяти. Но 1000 ячеек - не большой объём памяти... Ты, видиимо, используешь строки в 10к символов и более, да?
    Нет

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Лол, и что? 0,179 миллисекунды при самом худшем исходе, который просто не сможет произойти в силу особенностей интернета. Вопрос всё тот же: много ли ты выиграл, поставив на кон 1000 ячеек?
    Так а много ли я проиграл? "Целых 1000!!" только и слышу. Это всего-лишь 1 килобайт (лол, и то меньше же)

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Настолько трезво, что кладёшь болт на логику (на эту часть моего сообщения не отвечай. Лучше удели время моему вопросу в конце)
    Уделю, не волнуйся. Опять-же, нет, не кладу

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Оптимистичные расчёты. Только вот если бы ты умел в математику, ты бы знал, что там не десятые доли секунды, а сотые доли миллисекунды. Игроки оценили
    А, опечатка. Тем не менее игроки также и оценили твои 4 килобайта

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Прошу, начни писать по-русски. Перечитав эту часть твоего сообщения 5 раз, я всё ещё смутно понял её смысл. Видимо, именно поэтому мы до сих пор и общаемся...
    Хотя по русски и пишу, но ок, специально для тебя попытаюсь изъясняться только простыми двусоставными предложениями.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ты действительно считаешь, что гораздо логичнее информацию, которая будет использоваться исключительно при входе на сервер, хранить всё время, а не только в момент, когда игрок входит на сервер? Можешь даже не отвечать на всё то, что я написал выше. Ответ на этот вопрос расставит все точки над "i": либо ты начнёшь противоречить своим замечаниям в сторону Geebrox, либо ты настолько "оптимизатор-3000", что разговор дальше не имеет смысла быть.
    Нет, не считаю.
    Отвечу на всякий случай третий раз, авось дойдёт: я описал минусы пваров в самом начале, одним из них и являлось то, что они уступают в скорости переменным.
    А противоречить "замечаниям" Geebrox'а мне незачем, ибо удобство для каждого по своему понимается.
    Последний раз редактировалось Nexius_Tailer; 14.07.2016 в 02:04.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Нет, не считаю.
    Отвечу на всякий случай третий раз, авось дойдёт: я описал минусы пваров в самом начале, одним из них и являлось то, что они уступают в скорости переменным.
    Засим и закончим.
    Главное не узнай, что обращение к последним ячейкам массива быстрее, нежели к первым (или к одной переменной). А то начнёшь, ради прироста к скорости, создавать по 1000 переменных для каждого игрока...
    Если ты до сих пор не понял, то всё это время я пытался тебе объяснить, что нет у pVar существенных минусов: ни в скорости (тесты и расчёты есть), ни в удобстве использования, ни в чём либо ещё. Спорил бы ты с Созоновым, он бы назвал это синдромом утёнка...
    Желаешь без повода раскидываться памятью - пожалуйста. Но учить этому других не стоит. Учить подобному - удел п-и.

    P.S. И переставай уже пытаться строить из себя такую мессию, постоянно пытаясь сказать, что говоришь мне про одно и то же, а я, дурак такой, всё никак не могу понять тебя. Это у тебя фишка такая: участвовать в споре на определённую тему, отстаивая свою точку зрения, и постоянно заканчивать его одним и тем же? Хотя это риторический вопрос, есчо

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Засим и закончим.
    - - - Добавлено - - -

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    В сравнении с тестом DeimoS'а разница куда большая. Возможно это из-за того, что в первом образце кода нет создания переменной в цикле. (Как можно было вообще додуматься так насиловать стек?
    Это создано с целью уровнять условия, не? Хотя, в идеале, к SetPVar нужно было прикрутить ещё и разные имена, дабы функция постоянно резервировала новые участки "своей" памяти, а не работала с одним. Так я думал изначально.
    Но уже после публикации теста я понял, что предыдущие мои мысли не верны и, во-первых, pVar работают чуть иначе, и, во-вторых, вряд ли их работа сравнима с резервацией стэка.
    В любом случае, суть теста была не в точности, а в том, что различие в скорости там совсем несущественные (хоть разница между переменными/pVar и большая, но если взять конкретно результат pVar и вычислить примерное время обращения к одному pVar, можно понять, что ничего страшного не произойдёт (не будет ничего виснуть и т.п.). Именно в этом и заключалась суть всего моего повествования и моего кривого теста, в том числе.

    Была бы в Pawn иная альтернатива хоть какой-то динамической памяти - можно было бы использовать её. Но пока выбирать не приходится и, как по мне, логичнее подобную временную информацию хранить временно, а не держать её постоянно только ради того, чтоб сэкономить пару тысячных миллисекунды.

    И да, я говорю про "правильное" использование pVar, с удалением оных после использования, а не присвоения им нулевого значения, как делают многие. Тогда они копиться не должны (использовал при авторизации, загрузив в них пароль, сверил и удалил. Использовал в какой-нибудь команде, дабы передать введённые игроком параметры в диалог, и удалил. И так со всей временной информацией), хоть это и не является большой проблемой
    Последний раз редактировалось DeimoS; 14.07.2016 в 11:39.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Главное не узнай, что обращение к последним ячейкам массива быстрее, нежели к первым (или к одной переменной). А то начнёшь, ради прироста к скорости, создавать по 1000 переменных для каждого игрока...
    Давно знал. Так это уже в удобстве проигрывает)

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если ты до сих пор не понял, то всё это время я пытался тебе объяснить, что нет у pVar существенных минусов: ни в скорости (тесты и расчёты есть), ни в удобстве использования, ни в чём либо ещё.
    Ну а если ты не понял - ты мне объяснял про то, что я трачу память, но увеличиваю лишь чуть-чуть скорости, а я тебе про то - что увеличиваю скорость, тратя лишь чуть-чуть памяти. Я уж думал ты сам глубже зайдёшь и вдруг напишешь, что повторяем мы друг другу одно и то же, а ведь понять это оказалось более чем сложным. Я-то сразу сказал на этот счёт свою точку зрения: мне важнее скорость, чем память (даже в ситуациях, когда и того и другого потребляется мизерное количество).

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Желаешь без повода раскидываться памятью - пожалуйста. Но учить этому других не стоит. Учить подобному - удел п-и.
    Ну вот и опять
    На это можно смотреть с разных сторон, и если я опять повторю, типо, "желаешь раскидываться скоростью - пожалуйста", то вангую, что ты напишешь мне опять про мизерное количество этой скорости, продолжая описывать свои сэкономленные 4 килобайта.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    P.S. И переставай уже пытаться строить из себя такую мессию, постоянно пытаясь сказать, что говоришь мне про одно и то же, а я, дурак такой, всё никак не могу понять тебя. Это у тебя фишка такая: участвовать в споре на определённую тему, отстаивая свою точку зрения, и постоянно заканчивать его одним и тем же? Хотя это риторический вопрос, есчо
    Вот что из себя и пытался строить, так это в последнюю очередь мессию, честно
    Последний раз редактировалось Nexius_Tailer; 14.07.2016 в 14:21.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Этот спор можно продолжать вечно, кто-то считает, что тратит мизерное кол-во памяти, но при этом получает быстрый функционал. А кто-то считает, что теряет мизерное кол-во скорости, но при этом не тратит памяти, которое можно использовать в других целях. Каждый отстаивает свою точку зрения (глаза видят только то, что разум готов постичь). Если оба оппонента уверены в своей правоте и не желают слушать других, то есть ли смысл продолжать такой спор? Может хватит?!? Все привели свои аргументы и факты. Люди, прочитав эти доказательства, выберут для себя верный способ.

    //DeimoS: Мы и так закончили уже ведь :)
    Последний раз редактировалось DeimoS; 14.07.2016 в 21:48.

  6. #46
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Подскажите, как все же обойти регистрацию этим способом (для теста)

  7. #47
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Подскажите, как все же обойти регистрацию этим способом (для теста)
    Только сторонним софтом.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  8. #48
    Аватар для TBoPoIIIoK
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.07.2016
    Сообщений
    29
    Репутация:
    2 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Подскажите, как все же обойти регистрацию этим способом (для теста)
    https://www.youtube.com/watch?v=OD6a52nnEAw

  9. #49
    Аватар для 123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.02.2014
    Сообщений
    93
    Репутация:
    8 ±
    Цитата Сообщение от TBoPoIIIoK Посмотреть сообщение
    Спасибо, а обход сработает, если авторизация / регистрация вызывается в OnPlayerConnect, а не в OnPlayerRequestClass? Просто не получается повторить, как я понял, после нажатия Wait Connect, нужно тыкать на разморозку в собейте, но при нажатие у меня на полсекунды появляется экран возле особняка, после камера возвращается обратно на регистрацию / авторизацию.

    В любом случае вероятно я что-то делаю неправильно, а то на днях столкнулся с читерами, которые обходили авторизацию с ников администрации, и спокойно читерили под их аккаунтами, другого объяснение, кроме как использование этого обхода я не смог найти, поэтому придется использовать данный фикс, спасибо, буду наблюдать
    Последний раз редактировалось 123; 07.08.2016 в 17:18.

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

    Статус
    Оффлайн
    Регистрация
    13.07.2016
    Сообщений
    29
    Репутация:
    2 ±
    Цитата Сообщение от 123 Посмотреть сообщение
    Спасибо, а обход сработает, если авторизация / регистрация вызывается в OnPlayerConnect, а не в OnPlayerRequestClass? Просто не получается повторить, как я понял, после нажатия Wait Connect, нужно тыкать на разморозку в собейте, но при нажатие у меня на полсекунды появляется экран возле особняка, после камера возвращается обратно на регистрацию / авторизацию.

    В любом случае вероятно я что-то делаю неправильно, а то на днях столкнулся с читерами, которые обходили авторизацию с ников администрации, и спокойно читерили под их аккаунтами, другого объяснение, кроме как использование этого обхода я не смог найти, поэтому придется использовать данный фикс, спасибо, буду наблюдать
    Сработает, если в добавок перекрыть вывод диалогов и изменение позиции камеры ;)

 

 
Страница 5 из 5 ПерваяПервая ... 3 4 5

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

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

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

Ваши права

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