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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±

    как оптимизировать лучше

    1. stock GET_NUMBER_OF_DIGITS (_GNOD) {
    2.  
    3. _GNOD = |_GNOD|;
    4.  
    5. if(_GNOD < 10) return 1;
    6. else if(_GNOD < 100) return 2;
    7. else if(_GNOD < 1000) return 3;
    8. else if(_GNOD < 10000) return 4;
    9. else if(_GNOD < 100000) return 5;
    10. else if(_GNOD < 1000000) return 6;
    11. else if(_GNOD < 10000000) return 7;
    12. else if(_GNOD < 100000000) return 8;
    13. else if(_GNOD < 2147483647) return 9;
    14.  
    15. }


    как лучше оптимизировать данную функцию, может быть есть вариант как-то через mod узнать по прогону (паскаль привет)
    Последний раз редактировалось MassonNN; 19.12.2019 в 23:07.

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    https://pro-pawn.ru/showthread.php?1...NumberOfDigits

    1. stock vallen(number)
    2. {
    3. if (number < 0)
    4. number = -number;
    5. if (number < 100_000)
    6. {
    7. if (number < 100)
    8. return 1 + _:(number >= 10);
    9. if (number < 10_000)
    10. return 3 + _:(number >= 1_000);
    11. return 5;
    12. }
    13. if (number < 10_000_000)
    14. return 6 + _:(number >= 1_000_000);
    15. if (number < 1_000_000_000)
    16. return 8 + _:(number >= 100_000_000);
    17. return 10;
    18. }


    https://pro-pawn.ru/showthread.php?1...ll=1#post87649
    Последний раз редактировалось SteveStage; 19.12.2019 в 23:19.

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    это абсолютно аналогичная реализация

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Nestyreff Посмотреть сообщение
    это абсолютно аналогичная реализация
    А по сделая по другому, ты потеряешь скорость. Может быть и можно компактнее, но это не значит оптимизированее.

    Можно вот так:

    1. stock vallen(number)
    2. {
    3. if(number < 0)
    4. number = |number|;
    5. new str[10+1];
    6. valstr(str, number, true);
    7. return strlen(str);
    8. }


    Но это крайне сомнительная реализация.
    Последний раз редактировалось SteveStage; 19.12.2019 в 23:25.

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Нет, я говорю про то, что по ссылкам абсолютно аналогично сделано, а меня интересует возможное упрощение в плане перевода условий к математическим операциям и соответственно есть ли от этого профит или, наоборот, это еще хуже.

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    log10?
    Цитата Сообщение от Nestyreff Посмотреть сообщение
    Нет, я говорю про то, что по ссылкам абсолютно аналогично сделано, а меня интересует возможное упрощение в плане перевода условий к математическим операциям и соответственно есть ли от этого профит или, наоборот, это еще хуже.

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    log10?
    Тип брать log по числу и округлять по минимуму?

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

    Попробовал каждый вариант, самый быстрый это сравнение :/

    Причем как не странно log 10 один из самых долгих, а варианты с % (mod) ещё хуже.
    Последний раз редактировалось MassonNN; 20.12.2019 в 00:46.

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Nestyreff Посмотреть сообщение
    Попробовал каждый вариант, самый быстрый это сравнение :/

    Причем как не странно log 10 один из самых долгих, а варианты с % (mod) ещё хуже.
    https://pro-pawn.ru/showthread.php?1...ll=1#post87659

    Вот доработанная версия твоего способа подсчета из 1 поста:

    1. stock numlen(number)
    2. {
    3. if(number < 0)
    4. {
    5. if(number == cellmin)
    6. number = |(cellmin+1)|+1;
    7. else
    8. number = |number|;
    9. }
    10. if(number < 10)
    11. return 1;
    12. else if(number < 100)
    13. return 2;
    14. else if(number < 1000)
    15. return 3;
    16. else if(number < 10000)
    17. return 4;
    18. else if(number < 100000)
    19. return 5;
    20. else if(number < 1000000)
    21. return 6;
    22. else if(number < 10000000)
    23. return 7;
    24. else if(number < 100000000)
    25. return 8;
    26. else if(number < 1000000000)
    27. return 9;
    28. else if(number < 10000000000)
    29. return 10;
    30. else if(number < 100000000000)
    31. return 11;
    32. }
    Последний раз редактировалось SteveStage; 20.12.2019 в 01:26.

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

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    https://pro-pawn.ru/showthread.php?1...ll=1#post87659

    Вот доработанная версия твоего способа подсчета из 1 поста:

    1. stock numlen(number)
    2. {
    3. if(number == cellmin)
    4. number = |(cellmin+1)|+1;
    5. else
    6. number = |number|;
    7. if(number < 10)
    8. return 1;
    9. else if(number < 100)
    10. return 2;
    11. else if(number < 1000)
    12. return 3;
    13. else if(number < 10000)
    14. return 4;
    15. else if(number < 100000)
    16. return 5;
    17. else if(number < 1000000)
    18. return 6;
    19. else if(number < 10000000)
    20. return 7;
    21. else if(number < 100000000)
    22. return 8;
    23. else if(number < 1000000000)
    24. return 9;
    25. else if(number < 10000000000)
    26. return 10;
    27. else if(number < 100000000000)
    28. return 11;
    29. }
    Это абсолютно тоже самое, но здесь ещё зачем-то два последних порядка добавили зря, 2 с лишним миллиарда - максимальное положительное число в Pawn и C, поэтому от них толку никакого

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    https://pro-pawn.ru/showthread.php?1...NumberOfDigits

    1. stock vallen(number)
    2. {
    3. if (number < 0)
    4. number = -number;
    5. if (number < 100_000)
    6. {
    7. if (number < 100)
    8. return 1 + _:(number >= 10);
    9. if (number < 10_000)
    10. return 3 + _:(number >= 1_000);
    11. return 5;
    12. }
    13. if (number < 10_000_000)
    14. return 6 + _:(number >= 1_000_000);
    15. if (number < 1_000_000_000)
    16. return 8 + _:(number >= 100_000_000);
    17. return 10;
    18. }


    https://pro-pawn.ru/showthread.php?1...ll=1#post87649
    Такой вариант наиболее оптимальный. Тут только объединение условий в группы может как-то помочь ускорить работу функции. Какие-либо математические операции или вызов функций будет априори медленнее.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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