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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Так в данном случай мы тоже получим прирост производительности. Почему бы и нет?
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А теперь бегом перечитывать все мои предыдущие сообщения, в которых я объяснял почему в данном случае эти миллисекунды важны.
    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

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Так в данном случай мы тоже получим прирост производительности. Почему бы и нет?
    1) Код уже написан за тебя и тебе нужно лишь скопировать
    2) Такая реализация не усложняет читаемость кода, но, при этом, повышает скорость.

    С такой же логикой можно вообще забить на оптимизацию и писать как попало. А что, 2017 же!

    UPD: перенёс вопрос в отдельную тему
    Последний раз редактировалось DeimoS; 04.10.2017 в 20:17.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    >_>

    <_<

    Я просто оставлю это здесь:

    PHP код:
    stock GetNumberOfDigits(number)
    {
        if (
    number 100_000)
        {
            if (
    number 100)
                return 
    _:(number >= 10);
            if (
    number 10_000)
                return 
    _:(number >= 1_000);
            return 
    5;
        }
        if (
    number 10_000_000)
            return 
    _:(number >= 1_000_000);
        if (
    number 1_000_000_000)
            return 
    _:(number >= 100_000_000);
        return 
    10;

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

    http://pro-pawn.ru/showthread.php?12585
    PHP код:
    /*======== Настройки =========================================================*/
    #include <float>

    const PROFILER_ITERATIONS_MAJOR 100_000;
    const 
    PROFILER_ITERATIONS_MINOR 10;

    new const 
    code_snippets_names[3][] =
    {
        {
    "VVWVV"},
        {
    "DeimoS"},
        {
    "Daniel_Cortez"}
    };

    stock
        GetNumberOfDigits_VVWVV
    ({Float,_}:number)
    {
        return 
    number != floatround(floatlog(floatabs(number))) + 1;
    }

    stock GetCountsOfDigits_DeimoS(number)
    {
        if(
    number 100_000)
        {
            if(
    number 100)
            {
                if(
    number 10)
                    return 
    1;
                else
                    return 
    2;
            }
            else
            {
                if(
    number 1_000)
                    return 
    3;
                else
                {
                    if(
    number 10_000)
                        return 
    4;
                    else
                        return 
    5;
                }
            }
        }
        else
        {
            if(
    number 10_000_000)
            {
                if(
    number 1_000_000)
                    return 
    6;
                else
                    return 
    7;
            }
            else
            {
                if(
    number 100_000_000)
                    return 
    8;
                else
                {
                    if(
    number 1_000_000_000)
                        return 
    9;
                    else
                        return 
    10;
                }
            }
        }
    }

    stock GetNumberOfDigits_DC(number)
    {
        if (
    number 100_000)
        {
            if (
    number 100)
                return 
    _:(number >= 10);
            if (
    number 10_000)
                return 
    _:(number >= 1_000);
            return 
    5;
        }
        if (
    number 10_000_000)
            return 
    _:(number >= 1_000_000);
        if (
    number 1_000_000_000)
            return 
    _:(number >= 100_000_000);
        return 
    10;
    }

    // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, ..., 90, 100, 200, ..., 2_000_000_000
    static numbers[3];

    #define Prerequisites();\
        
    numbers[0] = 0; \
        for (new 
    0inc 119; ++iinc *= 10) \
            for (new 
    110; ++j+= inc) \
                
    numbers[j] = n; \
        
    numbers[82] = 1_000_000_000; \
        
    numbers[83] = 2_000_000_000; \
        static 
    i;

    #define CodeSnippet0();\
        
    for (0sizeof(numbers); ++i) \
            
    GetNumberOfDigits_VVWVV(numbers[i]);

    #define CodeSnippet1();\
        
    for (0sizeof(numbers); ++i) \
            
    GetCountsOfDigits_DeimoS(numbers[i]);

    #define CodeSnippet2();\
        
    for (0sizeof(numbers); ++i) \
            
    GetNumberOfDigits_DC(numbers[i]);
    /*======== Конец настроек ===================================================*/ 
    Код:
    Тестирование: 3 отрывка кода.
    Режим: интерпретируемый, 100000x10 итераций.
    VVWVV: 26177
    DeimoS: 7585
    Daniel_Cortez: 6924
    Код:
    Тестирование: 3 отрывка кода.
    Режим: с JIT-компиляцией, 100000x10 итераций.
    VVWVV: 9168
    DeimoS: 1093
    Daniel_Cortez: 1085



     DeimoS:
    Ты шо, это ведь слишком сложно в написании и не компактно! Гораздо важнее сэкономить количество строк
    Последний раз редактировалось DeimoS; 05.10.2017 в 16:27.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. 2 пользователя(ей) сказали cпасибо:
    DeimoS (05.10.2017) SooBad (05.10.2017)
  5. #34
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    >_>

    <_<

    Я просто оставлю это здесь:

    PHP код:
    stock GetNumberOfDigits(number)
    {
        if (
    number 100_000)
        {
            if (
    number 100)
                return 
    _:(number >= 10);
            if (
    number 10_000)
                return 
    _:(number >= 1_000);
            return 
    5;
        }
        if (
    number 10_000_000)
            return 
    _:(number >= 1_000_000);
        if (
    number 1_000_000_000)
            return 
    _:(number >= 100_000_000);
        return 
    10;

    Я, пожалуй, перенесу данную функцию в тему с GetNumberOfDigits (с указанием авторства), если ты не против..

  6. Пользователь сказал cпасибо:
    SooBad (05.10.2017)
  7. #35
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от VVWVV Посмотреть сообщение
    Я, пожалуй, перенесу данную функцию в тему с GetNumberOfDigits (с указанием авторства), если ты не против..
    Не против, только лучше обнови его ещё раз. В моём коде, равно как и в коде DeimoS'а, не учитывались отрицательные числа.
    Исправленная версия:
    PHP код:
    stock GetNumberOfDigits(number)
    // by Daniel_Cortez \\ pro-pawn.ru
        
    if (number 0)
            
    number = -number;
        if (
    number 100_000)
        {
            if (
    number 100)
                return 
    _:(number >= 10);
            if (
    number 10_000)
                return 
    _:(number >= 1_000);
            return 
    5;
        }
        if (
    number 10_000_000)
            return 
    _:(number >= 1_000_000);
        if (
    number 1_000_000_000)
            return 
    _:(number >= 100_000_000);
        return 
    10;

    Тест производительности (в вариант DeimoS'а я тоже добавил проверку на отрицательные числа):
      Открыть/закрыть
    PHP код:
    #include <float>

    const PROFILER_ITERATIONS_MAJOR 100_000;
    const 
    PROFILER_ITERATIONS_MINOR 10;

    new const 
    code_snippets_names[3][] =
    {
        {
    "VVWVV"},
        {
    "DeimoS"},
        {
    "Daniel_Cortez"}
    };

    stock
        GetNumberOfDigits_VVWVV
    ({Float,_}:number)
    {
        return 
    number != floatround(floatlog(floatabs(number))) + 1;
    }

    stock GetCountsOfDigits_DeimoS(number)
    {
        if (
    number 0)
            
    number = -number;
        if (
    number 100_000)
        {
            if(
    number 100)
            {
                if(
    number 10)
                    return 
    1;
                else
                    return 
    2;
            }
            else
            {
                if(
    number 1_000)
                    return 
    3;
                else
                {
                    if(
    number 10_000)
                        return 
    4;
                    else
                        return 
    5;
                }
            }
        }
        else
        {
            if(
    number 10_000_000)
            {
                if(
    number 1_000_000)
                    return 
    6;
                else
                    return 
    7;
            }
            else
            {
                if(
    number 100_000_000)
                    return 
    8;
                else
                {
                    if(
    number 1_000_000_000)
                        return 
    9;
                    else
                        return 
    10;
                }
            }
        }
    }

    stock GetNumberOfDigits_DC(number)
    {
        if (
    number 0)
            
    number = -number;
        if (
    number 100_000)
        {
            if (
    number 100)
                return 
    _:(number >= 10);
            if (
    number 10_000)
                return 
    _:(number >= 1_000);
            return 
    5;
        }
        if (
    number 10_000_000)
            return 
    _:(number >= 1_000_000);
        if (
    number 1_000_000_000)
            return 
    _:(number >= 100_000_000);
        return 
    10;
    }

    // 0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -20, ..., 90, -100, 200, ..., -2_000_000_000
    static numbers[3];

    #define Prerequisites(); \
        
    numbers[0] = 0; \
        for (new 
    0inc 119; ++iinc *= 10) \
            for (new 
    110; ++j+= inc) \
                
    numbers[j] = * (((j) & 1) * -1); \
        
    numbers[82] = 1_000_000_000; \
        
    numbers[83] = -2_000_000_000; \
        static 
    i;

    #define CodeSnippet0(); \
        
    for (0sizeof(numbers); ++i) \
            
    GetNumberOfDigits_VVWVV(numbers[i]);

    #define CodeSnippet1(); \
        
    for (0sizeof(numbers); ++i) \
            
    GetCountsOfDigits_DeimoS(numbers[i]);

    #define CodeSnippet2(); \
        
    for (0sizeof(numbers); ++i) \
            
    GetNumberOfDigits_DC(numbers[i]); 
    Код:
    Режим: интерпретируемый, 100000x10 итераций.
    VVWVV: 26277
    DeimoS: 10300
    Daniel_Cortez: 9775
    Код:
    Режим: с JIT-компиляцией, 100000x10 итераций.
    VVWVV: 9056
    DeimoS: 1170
    Daniel_Cortez: 1165
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Что скажете насчет такого варианта:
    PHP код:
    stock GetCountsOfDigits(number)
    {
        new 
    counts 0;
        if(
    number 0)
            
    number = -number;
        while(
    number != 0) {
            
    counts++;
            
    number /= 10;
        }
        return 
    counts;


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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Там была вверху ссылка на хабру. Вырезка из текста: "скорость которого линейно зависит от длины числа."
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Что скажете насчет такого варианта:
    PHP код:
    stock GetCountsOfDigits(number)
    {
        new 
    counts 0;
        if(
    number 0)
            
    number = -number;
        while(
    number != 0) {
            
    counts++;
            
    number /= 10;
        }
        return 
    counts;

    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

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Там была вверху ссылка на хабру. Вырезка из текста: "скорость которого линейно зависит от длины числа."
    Если не ошибаюсь то в pawn, ячейка равна 4 байта, следовательно максимальная длина проверяемого числа равна 10-ти - это немного.
    Поэтому вряд ли этот вариант будет сильно уступать описанным выше.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от NewGreen Посмотреть сообщение
    Если не ошибаюсь то в pawn, ячейка равна 4 байта, следовательно максимальная длина проверяемого числа равна 10-ти - это немного.
    Поэтому вряд ли этот вариант будет сильно уступать описанным выше.
    А если всё же не гадать, а просто провести тесты?
    Тем более, что выше уже практически готовый код есть.

    Да и, опять же, с каких пор экономия строк стала выгоднее процессорного времени?
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    29.09.2014
    Сообщений
    61
    Репутация:
    44 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А если всё же не гадать, а просто провести тесты?
    Тем более, что выше уже практически готовый код есть.
    Да и, опять же, с каких пор экономия строк стала выгоднее процессорного времени?
    Итераций 100000x100 (без jit) :
    time_Deimos = -6975
    time_DC = -6408
    time_NewGreen = -18560

    Итераций 100000x100 (с jit) :
    time_Deimos = -457
    time_DC = -522
    time_NewGreen = -4460

    В общем остальные вопросы "почему" отпадают)

 

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

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

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

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

Ваши права

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