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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от James_Cruise Посмотреть сообщение
    В данном случае,ваш алгоритм более неточный,тут и ослу понятно.
    Я не говорил что таймеры плохи,я говорю,что можно обойтись без него.
    Еще раз Вероятность != неточность или точность, это разные понятия.
    В принципе на этом можно и завершить дискуссию, она ни к чему не приведет.
    Последний раз редактировалось NewGreen; 17.10.2014 в 21:08.

  2. #22
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Еще можно обмануть систему переменных под которые выделяются 4 байта (не удобно писать 1 ячейка :-) ) и использовать массивы например так для целых чисел:
    PHP код:
    new arr[1 char]; // итого 1 байт 
    правда далеко на 1 байте не уедешь)) но можно использовать для небольших чисел.
    Чушь. Кол-во выделяемой памяти выравнивается по размеру ячейки, поэтому под 1 байт выделится 1 ячейка - 4 байта. И так далее: 2-4, 3-4, 4-4, 5-8, 6-8, 7-8, 8-8, 9-12, ...


    Цитата Сообщение от NewGreen Посмотреть сообщение
    В принципе я не вижу здесь никаких других сценариев, есть правда некоторая вероятность того, что переменная checkToAFK[playerid] может быть переключена случайна на true, но она очень маленькая.
    Погоня за мифической оптимизацией - не оправдание увеличению вероятности возникновения ошибок.
    В первую очередь, система должна быть максимально надёжной.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Чушь. Кол-во выделяемой памяти выравнивается по размеру ячейки, поэтому под 1 байт выделится 1 ячейка - 4 байта. И так далее: 2-4, 3-4, 4-4, 5-8, 6-8, 7-8, 8-8, 9-12, ...
    Согласен. Спасибо за информацию!

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Погоня за мифической оптимизацией - не оправдание увеличению вероятности возникновения ошибок.
    В первую очередь, система должна быть максимально надёжной.
    Насчет мифической оптимизации - это как раз про Pawn с его виртуальной машиной, т.к. что работает эффективно в одном языке в Pawn наоборот, даже элементарное деление работает быстрее чем побитовый сдвиг. Сам язык не развивается, и говорить про оптимизации на нем не совсем корректно.
    Насчет вероятности возникновения ошибок - код приведенный выше, должен работать без ошибок, а вероятность есть в любом алгоритме, она может зависеть не только от не/корректности алгоритма, но, и от внешних факторов.
    Если я сказал что она есть - то это не значит что баг обязательно появиться, в нормально построенном моде/программе, алгоритм будет работать идеально!

  4. #24
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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


    Цитата Сообщение от NewGreen Посмотреть сообщение
    Если я сказал что она есть - то это не значит что баг обязательно появиться
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Насчет вероятности возникновения ошибок - код приведенный выше, должен работать без ошибок, а вероятность есть в любом алгоритме, она может зависеть не только от не/корректности алгоритма, но, и от внешних факторов.
    • В односекундном таймере после присвоения массиву true может быть добавлен и другой пользовательский код.
    • Между вызовом односекундного таймера и OnPlayerUpdate может быть вызван другой коллбэк, причём не один.

    Можете защищать свой индусский код сколько угодно, но факт есть факт - в алгоритме есть ошибки и он будет работать неправильно.


    Цитата Сообщение от NewGreen Посмотреть сообщение
    в нормально построенном моде/программе, алгоритм будет работать идеально!
    Очередная голословная отговорка.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Смелое утверждение. А теперь докажите свою теорию.
    PHP код:
    #include <a_samp>

    main() {
    new 
    workTime GetTickCount();
    new 
    val 0;
    for(new 
    01000000i++) {
        
    val i*2;
        
    val /=2;
    }
    printf("div time = %d",GetTickCount() - workTime);
    val 0;
    workTime GetTickCount();
    for(new 
    01000000i++) {
        
    val i<<1;
        
    val >>= 1;
    }
    printf("Shift time = %d",GetTickCount() - workTime);

    div time = 39
    Shift time = 58

    Сравнение операторов умножения и деления с операторами побитового сдвига.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    • В односекундном таймере после присвоения массиву true может быть добавлен и другой пользовательский код.
    • Между вызовом односекундного таймера и OnPlayerUpdate может быть вызван другой коллбэк, причём не один.

    Можете защищать свой индусский код сколько угодно, но факт есть факт - в алгоритме есть ошибки и он будет работать неправильно.


    Очередная голословная отговорка.

    Удачи в написании нового RLS.
    Я не занимаюсь модостроительством не моя сфера деятельности, то что могут быть ошибки говорил с самого начала.
    Этот код лишь шаблон, не нужно делать столь критические выводы.
    Последний раз редактировалось NewGreen; 18.10.2014 в 14:18.

  6. #26
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    PHP код:
    #include <a_samp>

    main() {
    new 
    workTime GetTickCount();
    new 
    val 0;
    for(new 
    01000000i++) {
        
    val i*2;
        
    val /=2;
    }
    printf("div time = %d",GetTickCount() - workTime);
    val 0;
    workTime GetTickCount();
    for(new 
    01000000i++) {
        
    val i<<1;
        
    val >>= 1;
    }
    printf("Shift time = %d",GetTickCount() - workTime);

    div time = 39
    Shift time = 58
    Вы ещё на 100 или даже на 10 итераций потестируйте - тогда и format(string, sizeof(string), "%s", str) будет быстрее, чем string = str.
    Ну не делает никто тесты на время меньше 1 секунды, да ещё и отдельно друг от друга - любое постороннее приложение может повысить нагрузку на ЦП, повлияв на результат теста.

    Увеличим кол-во итераций и переделаем тест так, чтобы сгладить возможную разницу в нагрузке на ЦП, возникающую со временем.
    PHP код:
    #include <a_samp>

    //==================================[Settings]==================================

    #define PROFILE_ITERS_MAJOR 1_000_000
    #define PROFILE_ITERS_MINOR 100


    //====================================[Test]====================================

    main()
    {
        print(
    "Testing...\n");
        new 
    ticks0=0ticks1=0ijttmp_ticks;
        for(
    i=0i<PROFILE_ITERS_MAJOR; ++i)
        {
            
    tmp_ticks=GetTickCount();
            for(
    j=0j<PROFILE_ITERS_MINOR; ++j)
            {
                
    i*2;
                
    /= 2;
            }
            
    ticks0 += GetTickCount()-tmp_ticks;
            
    tmp_ticks=GetTickCount();
            for(
    j=0j<PROFILE_ITERS_MINOR; ++j)
            {
                
    i<<1;
                
    >>= 1;
            }
            
    ticks1 += GetTickCount()-tmp_ticks;
        }
        
    printf("Multiplication/division: %d"ticks0);
        
    printf("Shifting to the left/right: %d"ticks1);
        print(
    "\n");

      Открыть/закрыть

    Разница небольшая, но всё же есть, и далеко не в пользу операций умножения/деления.
    Впрочем, не удивлюсь, если на хостинге разница в пользу операций сдвига будет куда более значительной - в версии сервера для Linux используется более эффективная реализация виртуальной машины с расширениями GNU C.
     Отрывок из Pawn_Implementer_Guide.pdf



    Цитата Сообщение от NewGreen Посмотреть сообщение
    то что могут быть ошибки говорил с самого начала
    Тогда зачем предлагать такой код, если знаете, что в нём ошибки?
    Думаете, кому-то нужен будет заведомо ненадёжный метод из-за каких-то 10-20 сэкономленных процессорных тактов? -_-
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Вы ещё на 100 или даже на 10 итераций потестируйте - тогда и format(string, sizeof(string), "%s", str) будет быстрее, чем string = str.
    Ну не делает никто тесты на время меньше 1 секунды, да ещё и отдельно друг от друга - любое постороннее приложение может повысить нагрузку на ЦП, повлияв на результат теста.

    Увеличим кол-во итераций и переделаем тест так, чтобы сгладить возможную разницу в нагрузке на ЦП, возникающую со временем.
      Открыть/закрыть
    PHP код:
    #include <a_samp>

    //==================================[Settings]==================================

    #define PROFILE_ITERS_MAJOR 1_000_000
    #define PROFILE_ITERS_MINOR 100


    //====================================[Test]====================================

    main()
    {
        print(
    "Testing...\n");
        new 
    ticks0=0ticks1=0ijttmp_ticks;
        for(
    i=0i<PROFILE_ITERS_MAJOR; ++i)
        {
            
    tmp_ticks=GetTickCount();
            for(
    j=0j<PROFILE_ITERS_MINOR; ++j)
            {
                
    i*2;
                
    /= 2;
            }
            
    ticks0 += GetTickCount()-tmp_ticks;
            
    tmp_ticks=GetTickCount();
            for(
    j=0j<PROFILE_ITERS_MINOR; ++j)
            {
                
    i<<1;
                
    >>= 1;
            }
            
    ticks1 += GetTickCount()-tmp_ticks;
        }
        
    printf("Multiplication/division: %d"ticks0);
        
    printf("Shifting to the left/right: %d"ticks1);
        print(
    "\n");


      Открыть/закрыть

    Разница небольшая, но всё же есть, и далеко не в пользу операций умножения/деления.
    Впрочем, не удивлюсь, если на хостинге разница в пользу операций сдвига будет куда более значительной - в версии сервера для Linux используется куда более эффективная реализация виртуальной машины с расширениями GNU C.
     Отрывок из Pawn_Implementer_Guide.pdf
    Позвольте узнать параметры вашего компьютера, у меня Intel Core i7 4770K – 3.50GHz. / Intel Z87/LAN ASUS Z87-PRO
    и вот такие результаты кода приведенного вами:
      Открыть/закрыть



    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Тогда зачем предлагать такой код, если знаете, что в нём ошибки?
    Думаете, кому-то нужен будет заведомо ненадёжный метод из-за каких-то 10-20 сэкономленных процессорных тактов? -_-
    Скажу так, изначально я предлагал следующий вариант, вместо присваивания переменной, значение функции GetTickCount(), использовать булевые переменные с true/false, также я лишь показал пример алгоритма, при этом предупреждая о возможных недостатках, если бы я хотел кому то что то предложить, я бы создал отдельную тему.

    - - - Добавлено - - -

    А на Linux уже результат другой:
      Открыть/закрыть


    ----------
    Loaded log file: "server_log.txt".
    ----------

    SA-MP Dedicated Server
    ----------------------
    v0.3z, (C)2005-2014 SA-MP Team

    [17:36:21] filterscripts = "" (string)
    [17:36:21]
    [17:36:21] Server Plugins
    [17:36:21] --------------
    [17:36:21] Loaded 0 plugins.

    [17:36:21]
    [17:36:21] Filterscripts
    [17:36:21] ---------------
    [17:36:21] Loaded 0 filterscripts.

    [17:36:21] Testing...

    [17:36:30] Multiplication/division: 4389
    [17:36:30] Shifting to the left/right: 3496
    [17:36:30]

    [17:36:30] Number of vehicle models: 0
    Последний раз редактировалось NewGreen; 18.10.2014 в 18:27.

  8. #28
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Позвольте узнать параметры вашего компьютера
    Если это имеет какое-то значение, процессор Intel Pentium Dual-Core E6600 - 3.06GHz.


    Цитата Сообщение от NewGreen Посмотреть сообщение
    А на Linux уже результат другой
    Что и следовало ожидать.


    Цитата Сообщение от NewGreen Посмотреть сообщение
    Скажу так, изначально я предлагал следующий вариант, вместо присваивания переменной, значение функции GetTickCount(), использовать булевые переменные с true/false, также я лишь показал пример алгоритма, при этом предупреждая о возможных недостатках, если бы я хотел кому то что то предложить, я бы создал отдельную тему.
    И снова уходим от ответа.
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Тогда зачем предлагать такой код, если знаете, что в нём ошибки?
    Думаете, кому-то нужен будет заведомо ненадёжный метод из-за каких-то 10-20 сэкономленных процессорных тактов? -_-
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    И снова уходим от ответа.
    Я могу признать что был не прав, в том что предложил заведомо недоработанный вариант алгоритма, тем не менее, акцент делался не на сам алгоритм (это был лишь набросок), а на то что в конткретном случае с системой АФК, эффективнее использовать булевые переменные как переключатель, нежели присваивать переменной значение функции.
    Развели мы с вами холивар тут.

  10. #30
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    эффективнее использовать булевые переменные как переключатель, нежели присваивать переменной значение функции.
    Эффективнее, но не приемлемее для данной ситуации. Могли бы просто подождать более удачного случая, нежели плодить быдлокодеров из тех, кто последует вашему примеру. Даже если пытаться объяснить недостатки, всё равно найдутся те, кто не поймёт (или просто не захочет понимать в погоне за "оптимизацией") ни одного вашего слова и будет смотреть только на код.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 3 из 4 ПерваяПервая 1 2 3 4 ПоследняяПоследняя

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

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

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

Ваши права

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