Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 20

Тема: Цикл for

  1. #1
    Аватар для Son of the Moon
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2016
    Сообщений
    52
    Репутация:
    2 ±

    Цикл for

    Доброе время суток.
    Где-то слышал о том что цикл for работает быстрее если:

    PHP код:
    #define MAX_AMOUNT     25
    for(new MAX_AMOUNT0i--)
    {

    Нежели так:
    PHP код:
    #define MAX_AMOUNT     25
    for(new iMAX_AMOUNTi++)
    {

    Так ли это? если же да, почему так получается?

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

    Статус
    Оффлайн
    Регистрация
    01.03.2015
    Сообщений
    245
    Репутация:
    55 ±
    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    Доброе время суток.
    Где-то слышал о том что цикл for работает быстрее если:

    PHP код:
    #define MAX_AMOUNT     25
    for(new MAX_AMOUNT0i--)
    {

    Нежели так:
    PHP код:
    #define MAX_AMOUNT     25
    for(new iMAX_AMOUNTi++)
    {

    Так ли это? если же да, почему так получается?
    Изменю под вариант от DC...
    Тесты проводились на http://imgur.com/a/MFA6S
    Последний раз редактировалось Sp1ke; 03.09.2016 в 22:47.

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Вообще то цикл на оборот быстрей из пару инструкции в ASM
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    Доброе время суток.
    Где-то слышал о том что цикл for работает быстрее если:

    PHP код:
    #define MAX_AMOUNT     25
    for(new MAX_AMOUNT0i--)
    {

    Нежели так:
    PHP код:
    #define MAX_AMOUNT     25
    for(new iMAX_AMOUNTi++)
    {

    Так ли это? если же да, почему так получается?
    Во-первых, у этих циклов два разных диапазона. Если во втором цикле счётчик принимает диапазон значений от 0 до MAX_AMOUNT-1, то в первом - от MAX_AMOUNT до 1.
    Исправленный вариант обратного цикла будет выглядеть так:
    PHP код:
    for (new MAX_AMOUNTi-- != 0; )
    {

    Во-вторых, у обратного цикла есть потенциал выполняться быстрее за счёт сравнения с нулём в условии выхода: вместо двух инструкций AMX (eq, jzer/jnz) будет использоваться только одна (jzer/jnz). Впрочем, на практике это принесёт пользу лишь в самом критичном ко времени выполнения коде - строковых функциях, часто вызываемых коллбэках типа OnPlayerUpdate, etc.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. Пользователь сказал cпасибо:
    VVWVV (03.09.2016)
  6. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Если нужна максимальная производительность, то циклы лучше вообще не использовать, а продублировать код нужное количество раз (это не шутка).

    Вы совсем не там ищете оптимизацию, оптимизируйте свои алгоритмы. Это не Pawn медленный, это просто вы не умеете им пользоваться. Более того, пытаясь "оптимизировать" языковые конструкции подобным образом, вы ухудшаете читабельность кода, что усложнит его модификацию и увеличит вероятность появления ошибки. Оно вам надо? Лучше уберите тысячу проверок с IsPlayerInRangeOfPoint для ваших домов, это даст реально существенный результат (видел много примеров, почти у всех так).

  7. 2 пользователя(ей) сказали cпасибо:
    Nurick (04.09.2016) Profyan (04.09.2016)
  8. #6
    Аватар для Son of the Moon
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2016
    Сообщений
    52
    Репутация:
    2 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Если нужна максимальная производительность, то циклы лучше вообще не использовать, а продублировать код нужное количество раз (это не шутка).

    Вы совсем не там ищете оптимизацию, оптимизируйте свои алгоритмы. Это не Pawn медленный, это просто вы не умеете им пользоваться. Более того, пытаясь "оптимизировать" языковые конструкции подобным образом, вы ухудшаете читабельность кода, что усложнит его модификацию и увеличит вероятность появления ошибки. Оно вам надо? Лучше уберите тысячу проверок с IsPlayerInRangeOfPoint для ваших домов, это даст реально существенный результат (видел много примеров, почти у всех так).
    ты хочешь сказать что если к примеру я использую на сервере 1000 домов, на каждый писать загрузку?

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

    Кстати что на счет этого кода?
    Пример:
    PHP код:
    new counter;

    public 
    OnGameModeInit()
    {
         
    Loading();
         return 
    true;
    }

    stock Loading()
    {
         if(
    counter 10)
         {
              
    test[counter] = 1;
              
    counter++;
              
    Loading();

         }
         return 
    true;


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

    Статус
    Оффлайн
    Регистрация
    07.06.2016
    Адрес
    Minsk, Belarus
    Сообщений
    78
    Репутация:
    15 ±
    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    ты хочешь сказать что если к примеру я использую на сервере 1000 домов, на каждый писать загрузку?

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

    Кстати что на счет этого кода?
    Пример:
    PHP код:
    new counter;

    public 
    OnGameModeInit()
    {
         
    Loading();
         return 
    true;
    }

    stock Loading()
    {
         if(
    counter 10)
         {
              
    test[counter] = 1;
              
    counter++;
              
    Loading();

         }
         return 
    true;

    Рекурсивная функция.

  10. #8
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    ты хочешь сказать что если к примеру я использую на сервере 1000 домов, на каждый писать загрузку?
    Нет, я хочу сказать именно то, что я там написал.

    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    Кстати что на счет этого кода?
    Пример:
    PHP код:
    new counter;

    public 
    OnGameModeInit()
    {
         
    Loading();
         return 
    true;
    }

    stock Loading()
    {
         if(
    counter 10)
         {
              
    test[counter] = 1;
              
    counter++;
              
    Loading();

         }
         return 
    true;

    Не вижу ни одной причины использовать здесь рекурсивный вызов функции.
    PHP код:
    new counter;

    public 
    OnGameModeInit()
    {
        
    Loading();
        return 
    true;
    }

    stock Loading()
    {
        while (
    counter 10)
        {
            
    test[counter] = 1;
            
    counter++;
        }
        return 
    true;


  11. #9
    Аватар для Son of the Moon
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2016
    Сообщений
    52
    Репутация:
    2 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Нет, я хочу сказать именно то, что я там написал.



    Не вижу ни одной причины использовать здесь рекурсивный вызов функции.
    PHP код:
    new counter;

    public 
    OnGameModeInit()
    {
        
    Loading();
        return 
    true;
    }

    stock Loading()
    {
        while (
    counter 10)
        {
            
    test[counter] = 1;
            
    counter++;
        }
        return 
    true;

    ну ты же написал что лучше вообще не использовать циклы, while же цикл, тогда как по другому?

  12. #10
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Son of the Moon Посмотреть сообщение
    ну ты же написал что лучше вообще не использовать циклы, while же цикл, тогда как по другому?
    Я написал: "продублировать код нужное количество раз", где тут хоть слово о рекурсии? И рекурсия медленнее циклов (по крайней мере в Pawn).

    PHP код:
    new counter;

    public 
    OnGameModeInit()
    {
        
    Loading();
        return 
    true;
    }

    stock Loading()
    {
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        
    test[counter] = 1;
        
    counter++;
        return 
    true;

    Да, это быстрее циклов. Но разумно ли так писать код?

 

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

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

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

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

Ваши права

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