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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Как ты собираешься через этот профайлер проверять то, как быстро у тебя код внутри таймера срабатывает? Пол мода переносить внутрь этого профайлера, чтоб соблюсти все зависимости?
    И если да, то насколько удобно будет делать это после каждой новой правки кода таймера и функций, которые вызываются в таймере? Вопрос риторический.
    Все-же отвечу. Я вообще не буду проверять целые куски кода. Я проверю лишь то, на сколько сильно я потеряю в производительности, если буду вызывать системы через функции, использовать рекурсию или построить циклическую систему и т.д. Совсем в экзотических случаях, я посмотрю asm-листинги.
    Если моя функция предполагает использование конструкции "цикл в цикле", то я не буду судорожно дрожать от её использования и городить системы вроде итераторов чтобы избавиться от вложенного цикла путем выискивания всех случаев когда необходимо изменить значение итератора. Возможно это где-то по дилетантски, но зато все ясно и понятно.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну и сразу говорю, что любые дальнейшие сообщения, никак не вносящие в обсуждение какой-либо конструктив (то бишь, если не будет пруфов тем или иным высказываниям), будут считаться оффтопом и выпиливаться согласно правилам форума. Так что советую заранее подумать, стоит ли трать время на то, чтоб в очередной раз метнуть стрелки, не оставив никаких ссылок, подтверждающих свои высказывания.
    Самое интересное что инициатором был именно ты. И все сообщение в данной теме после #13 не несут в себе никакой полезной информации, а лишь какие-то обвинения что этот не знает этого, а тот не знает того. Не нужно было по крайней мере переходить на личности, а свою точку зрения касаемо long_call_time описать непредвзято и решение оставить за человеком который прочитает все это, ибо для кого-то эта функция полезна, а для кого то совсем наоборот.
    То что ты считаешь правильным, не обязывает других так думать, даже если они явно не правы. Ты же видел код YSI? - Да там черт ногу сломит, и попробуй доказать Y-Less что он не прав.

    UPD:
    Я вообще пишу без crashdetect :)

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Тык (пару раз ещё обсуждалось в других каналах помимо omp-support, но этого вполне хватает).
    Эмм, и где тут хоть слово о том, что автор что-то там понял? Я вижу там только то, что ты опять кому-то попытался продавить свою идею о том, что функция работает не так, как ты себе это фантазируешь, а тебе лишь сказали, что она и не задумывалась таковой.

    Опять же, копаемся в репозитории crashdetect и находим там вот такую тему - https://github.com/Zeex/samp-plugin-...tect/issues/82 - в которой Y-Less продолжает утверждать, что всё работает так, как задумывалось (спустя ~5 месяцев после первого PR). Как-то не сходится с твоими утверждениями...

    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    заметь, все описываемые тобою случаи прекрасно покрывались бы, если бы даже с текущими методами работы сама константная задержка была задрана так, чтобы ловить аномально долгие выполнения, даже безотносительно производительности физического сервера. Т.е. ты пытаешься защищать то, что реализовано плохо даже с той задумкой, которая есть сейчас.
    Я лишь заметил, что ты так и не понял сути написанного мной, раз говоришь про какое-то "задирание константной задержки". Впрочем, и по остальному написанному тобой оно видно.

    Давай я тебе на простых примерах покажу принцип применения функций плагина, раз ты так и не осилил их.
    Собственно, вот:
    1. #include <a_samp>
    2. #include <crashdetect>
    3.  
    4.  
    5. main()
    6. {
    7. print("\n----------------------------------");
    8. print(" Blank Gamemode by your name here");
    9. print("----------------------------------\n");
    10. }
    11.  
    12. {
    13. /*
    14.   Нас не интересует то, как долго грузится OnGameModeInit,
    15.   так что просто "отключаем" проверку времени для этого коллбэка.
    16.  
    17.   Используем SetCrashDetectLongCallTime, а не DisableCrashDetectLongCall,
    18.   так как с "DisableCrashDetectLongCall" мы можем получить ложное при
    19.   следующем включении и это самый простой способ обхода ложного срабатывания
    20.   (по крайней мере из тех, что мне известны)
    21.   */
    22. SetCrashDetectLongCallTime(cellmax);
    23.  
    24. SetTimer("@__SomeTimer", 1000, true);
    25. }
    26.  
    27. @__SomeTimer();
    28. @__SomeTimer()
    29. {
    30. /*
    31.   Представим, что нам крайне важно, чтоб код внутри этого таймера срабатывал не более, чем за секунду, дабы
    32.   следующее срабатывание таймера произошло без задержек
    33.   (не будем учитывать погрешность нативных таймеров, представив, что у нас включен плагин с их фиксом)
    34.   */
    35. EnableCrashDetectLongCall();
    36. SetCrashDetectLongCallTime(1000*1000);// Включаем замер скорости обработки кода, устанавливая время в 1 секунду (1000 = 1 миллисекунда)
    37. new ms = GetTickCount();
    38.  
    39. for(new i; i < 1_000_000; i++) {} // Пусть это будет имитацией кода, который нам нужно выполнить
    40.  
    41. printf("Таймер сработал за %d мс (%d)", GetTickCount()-ms, GetCrashDetectLongCallTime());
    42. DisableCrashDetectLongCall();// Дабы секундная проверка не распространилась на остальной код - отключаем её
    43. }

    Это то, какой мы написали нужную нам систему в первый раз, удостоверившись, что код внутри таймера не срабатывает более, чем за 1 секунду. "Багованный" crashdetect молчит, как и положено:


    *скрин в виде ссылки для тех, у кого не грузит*


    Теперь представим, что мы продолжаем работать над модом, например, в течении года и постепенно добавляем в таймер мелкие проверки и прочий незначительный код. И вот в один момент у нас получается так, что общее время обработки кода внутри таймера превышает важную нам секунду:
    1. #include <a_samp>
    2. #include <crashdetect>
    3.  
    4.  
    5. main()
    6. {
    7. print("\n----------------------------------");
    8. print(" Blank Gamemode by your name here");
    9. print("----------------------------------\n");
    10. }
    11.  
    12. {
    13. SetCrashDetectLongCallTime(cellmax);
    14.  
    15. SetTimer("@__SomeTimer", 1000, true);
    16. }
    17.  
    18. @__SomeTimer();
    19. @__SomeTimer()
    20. {
    21. EnableCrashDetectLongCall();
    22. SetCrashDetectLongCallTime(1000*1000);
    23. new ms = GetTickCount();
    24. /*
    25.   Увеличим число итераций для увеличения времени срабатывания кода, не меняя ничего остального
    26.   */
    27. for(new i; i < 100_000_000; i++) {}
    28.  
    29. printf("Таймер сработал за %d мс (%d)", GetTickCount()-ms, GetCrashDetectLongCallTime());
    30. DisableCrashDetectLongCall();
    31. }

    И, о боже, что это!? Плагин сообщает нам о том, что время обработки кода превысило важную нам секунду:


    *скрин в виде ссылки для тех, у кого не грузит*

    Как же это так? Почему я смог реализовать функционал плагина, получив от этого пользу? Ведь он же сломан и бесполезен




    punkochel, сорри, но отвечать на твоё сообщение подробно не буду. Скажу лишь, что если конкретно ТЫ что-то там не делаешь - не значит, что функции плагина от этого становятся багованными (а изначально я именно эту версию Nexius оспаривал и оспариваю) :) И нет, полезную информацию все (как минимум, мои) сообщения несут. Ибо в них опровергается очередная чушь, коей в сообществе SAMP хватает.




    Собственно, раз уж я дал пример того, как можно (и нужно) использовать функции плагина, не ловя, при этом, ЛОЖНЫЕ СРАБАТЫВАНИЯ (!?!), то, думаю, тему можно закрыть, дабы не плодить ещё больший оффтоп, основанный на фантазиях одного человека и "я делаю вот так, а не так" другого. Тем более, что, за время моего отсутствия на форуме, автор никаких дополнительных вопросов не задал, а значит и проблема, видимо, решена.
    Последний раз редактировалось DeimoS; 14.02.2023 в 18:31.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    UPD: Для особо упоротых можем даже вот такой пример сделать:

    1. #include <a_samp>
    2. #include <crashdetect>
    3.  
    4.  
    5. main()
    6. {
    7. print("\n----------------------------------");
    8. print(" Blank Gamemode by your name here");
    9. print("----------------------------------\n");
    10. }
    11.  
    12. {
    13. SetCrashDetectLongCallTime(cellmax);
    14.  
    15. SetTimer("@__SomeTimer", 1000, true);
    16. }
    17.  
    18. @__SomeTimer();
    19. @__SomeTimer()
    20. {
    21. EnableCrashDetectLongCall();
    22. SetCrashDetectLongCallTime(1000*1000);
    23. new ms = GetTickCount();
    24.  
    25. static var;// Изменился только код начиная с этой строки
    26. if(!var)
    27. {
    28. for(new i; i < 1_000_000; i++) {}
    29. }
    30. else
    31. {
    32. for(new i; i < 100_000_000; i++) {}
    33. }
    34. var = !var;// И заканчивая этой
    35.  
    36. printf("Таймер сработал за %d мс (%d)", GetTickCount()-ms, GetCrashDetectLongCallTime());
    37. DisableCrashDetectLongCall();
    38. }


    Результат:

    *ссылка на скрин*

    Как видно, плагин реагирует только на те случаи, когда включается в работу "прожорливый" цикл и код внутри таймера срабатывает более, чем за секунду (если что, сообщение от плагина приходит раньше, чем то сообщение, которое нам показывает таймер, так как "отсчёт" нужной нам секунды в плагине заканчивается раньше срабатывания кода таймера и плагин нам об этом сообщает. То бишь: "старт обработки @__SomeTimer() => прошла секунда и пришло сообщение от crashdetect => сервер закончил обрабатывать код @__SomeTimer() и выдал printf"). Ложных не наблюдается. ЧТД.

    P.S. Прошу заметить, что Nexius так и не скинул ни одного примера из других ЯП с тем фантазийным функционалом, который он требует от crashdetect =) Впрочем, не в первый и, думаю, не в последний раз он ведёт себя так, как ведёт.
    Если кто-то захочет что-то сказать по делу касаемо обсуждаемой темы - пишите в личку (вместе с тестом того, что вы хотите сюда отправить, дабы я убедился, что это не очередной оффтоп) и открою тему для вас. Закрыто.

    UPD2: Ну и, по просьбе трудящихся, вот, если что, ссылка на архив со всем нужным для воспроизведения теста - *тыщ*
    Все 3 примера объединены в скрипте и переключаются сменой макроса в начале мода
    Последний раз редактировалось DeimoS; 14.02.2023 в 18:47.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 
Страница 3 из 3 ПерваяПервая 1 2 3

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

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

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

Ваши права

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