Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±

    Как максимально быстро узнать название месяца.

    Я вас что? Да, категорический приветствую.
    Собственно вопрос написан в названии темы.

     Подумал подумал и написал свою версию (но такое даже на ГИ не пишут, наверно)
    Код:
    GetMonthName(month)
    {
    	new mname[12];
    	switch(month)
    	{
    	    case 1: format(mname, sizeof(mname), "Января");
    	    //....куча говнокода
    	}
    	return mname;
    }


    А также...

     Вариант с Г-И
    Код:
    stock GetMonthName() 
    { 
     new name[32]; 
     new year,month,day; 
     getdate(year, month, day); 
     switch(month) 
     { 
       case   1: format(name,32,"Январь"); 
       case   2: format(name,32,"Февраль"); 
       case   3: format(name,32,"Март"); 
       case   4: format(name,32,"Апрель"); 
       case   5: format(name,32,"Май"); 
       case   6: format(name,32,"Июнь"); 
       case   7: format(name,32,"Июль"); 
       case   8: format(name,32,"Август"); 
       case   9: format(name,32,"Сентябрь"); 
       case  10: format(name,32,"Октябрь"); 
       case  11: format(name,32,"Ноябрь"); 
       case  12: format(name,32,"Декабрь"); 
     } 
     return name; 
    }

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

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    PHP код:

    static gMonthNames[][9] = {
        
    "Январь",
        
    "Февраль",
        
    "Март",
        
    "Апрель",
        
    "Май",
        
    "Июнь",
        
    "Июль",
        
    "Август",
        
    "Сентябрь",
        
    "Октябрь",
        
    "Ноябрь",
        
    "Декабрь"
    };

    stock GetMonthName(monthname[], const size sizeof(name))
    {
        if (
    month || month sizeof(gMonthNames) + 1) {
            return 
    0;
        }

        
    name[0] = '\0';
        
    strcat(namegMonthNames[month 1], size);

        return 
    1;
    }

    stock GetCurrentMonthName(name[], const size sizeof(name))
    {
        new 
    month;
        
    getdate(_month_);

        
    name[0] = '\0';
        
    strcat(namegMonthNames[month 1], size);
    }

    stock ReturnMonthName(month)
    {
        if (
    month || month sizeof(gMonthNames)) {
            return 
    0;
        }

        return 
    gMonthNames[month 1];
    }

    stock ReturnCurrentMonthName()
    {
        new 
    month;
        
    getdate(_month_);

        return 
    gMonthNames[month 1];

    Последний раз редактировалось ziggi; 17.01.2016 в 15:45.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    PHP код:
    stock GetMonthName(numbername[], size sizeof(name))
    {
        static const 
    month_names[12][] =
        {
            !
    "January", !"February", !"March", !"April", !"May", !"June",
            !
    "July", !"August", !"September", !"October", !"November", !"December"
        
    };
        if (
    <= number <= sizeof(month_names))
            return 
    strunpack(namemonth_names[number 1], size);
        return 
    0;

    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    PHP код:
    stock GetMonthName(numbername[], size sizeof(name))
    {
        static const 
    month_names[12][] =
        {
            !
    "January", !"February", !"March", !"April", !"May", !"June",
            !
    "July", !"August", !"September", !"October", !"November", !"December"
        
    };
        if (
    <= number <= sizeof(month_names))
            return 
    strunpack(namemonth_names[number 1], size);
        return 
    0;

    Без упаковки будет быстрее, имхо.

    P.S. Человек с lightcode проводил тесты условий, вот какие он результаты получил (я лично не проверял):
    PHP код:
    3285 c
    2478 a 
    && c
    4947 IS_IN_RANGE 
    PHP код:
    #define IS_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < (((%2) + 1) - ((%1) + cellmin))) 

  5. #5
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±
    Close.

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

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


    Цитата Сообщение от ziggi Посмотреть сообщение
    Без упаковки будет быстрее, имхо.
    http://pro-pawn.ru/showthread.php?12585
      Открыть/закрыть
    PHP код:
    /*======== Настройки =========================================================*/
    const PROFILER_ITERATIONS_MAJOR 1_000_000;
    const 
    PROFILER_ITERATIONS_MINOR 100;

    new const 
    code_snippets_names[][] =
    {
        {
    "strcat"},
        {
    "strunpack"},
        {
    "memcpy"}
    };

    #define Prerequisites();\
        
    static const UNPACKED_STR[] = "Sample text";\
        static const 
    PACKED_STR[] = !"Sample text";\
        new 
    buffer[32];

    #define CodeSnippet0();\
        
    buffer[0] = '\0'strcat(bufferUNPACKED_STR);

    #define CodeSnippet1();\
        
    strunpack(bufferPACKED_STR);

    #define CodeSnippet2();\
        
    memcpy(bufferPACKED_STR0sizeof(UNPACKED_STR) * (cellbits charbits));
    /*======== Конец настроек ===================================================*/ 

    Код:
    Тестирование: 3 отрывка кода.
    Режим: интерпретируемый, 1000000x100 итераций.
    strcat: 14111
    strunpack: 12558
    memcpy: 13253
    Код:
    Тестирование: 3 отрывка кода.
    Режим: с JIT-компиляцией, 1000000x100 итераций.
    strcat: 9460
    strunpack: 11608
    memcpy: 7433
    Как видно, при интерпретации быстрее strunpack, а с JIT - memcpy.
    Мало того, можно заставить memcpy работать c JIT ещё быстрее, сделав вместо вызова нативной функции подстановку процессорных инструкций - функция сравнительно простая для этого.
    Но я всё же выбрал strunpack, как компромисс между скоростью выполнения и компактностью данных. Алгоритм не такой уж и сложный (всего-то вызов одной функции), чтобы производительность была в приоритете.


    Цитата Сообщение от ziggi Посмотреть сообщение
    Человек с lightcode проводил тесты условий, вот какие он результаты получил (я лично не проверял):
    PHP код:
    3285 c
    2478 a 
    && c
    4947 IS_IN_RANGE 
    PHP код:
    #define IS_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < (((%2) + 1) - ((%1) + cellmin))) 
    ИМХО, вопрос спорный, т.к. результат может зависеть от вероятности вхождения/не вхождения числа в заданный диапазон и от использования JIT.
    Одним тестом тут вряд ли обойдёшься (кстати, тебе показывали код теста?), следует оптимизировать код, исходя из ситуации. Причём, нужно хорошо знать, в какие инструкции AMX превратится код на Pawn, чтобы быть уверенным в эффективности оптимизации.
    Например, можно сделать проверку даже так:
    PHP код:
    stock IsInRange(xab)
    {
        if (
    <= x)
            if (
    <= b)
                return 
    1;
        return 
    0;

      Открыть/закрыть
    PHP код:
    /*======== Настройки =========================================================*/
    const PROFILER_ITERATIONS_MAJOR 1_000_000;
    const 
    PROFILER_ITERATIONS_MINOR 100;

    new const 
    code_snippets_names[2][] =
    {
        {
    "if (RANGE_BEGIN <= j <= RANGE_END)"},
        {
    "if (RANGE_BEGIN <= j && j <= RANGE_END)"},
        {
    "if (RANGE_BEGIN <= j) if (j <= RANGE_END)"}
    };

    #define Prerequisites();\
        
    const RANGE_BEGIN 1;\
        const 
    RANGE_END PROFILER_ITERATIONS_MINOR 2;

    DoNothing()
    {
        
    #emit retn
    }

    #define CodeSnippet0();\
        
    if (RANGE_BEGIN <= <= RANGE_ENDDoNothing();

    #define CodeSnippet1();\
        
    if (RANGE_BEGIN <= && <= RANGE_ENDDoNothing();

    #define CodeSnippet2();\
        
    if (RANGE_BEGIN <= j) if (<= RANGE_ENDDoNothing();
    /*======== Конец настроек ===================================================*/ 

    Код:
    Тестирование 3 отрывка кода.
    Режим: интерпретируемый, 1000000x1000 итераций.
    if (RANGE_BEGIN <= j <= RANGE_END): 59765
    if (RANGE_BEGIN <= j && j <= RANGE_END): 70405
    if (RANGE_BEGIN <= j) if (j <= RANGE_END): 51045
    Код:
    Тестирование 3 отрывка кода.
    Режим: с JIT-компиляцией, 10000000x1000 итераций.
    if (RANGE_BEGIN <= j <= RANGE_END): 74329
    if (RANGE_BEGIN <= j && j <= RANGE_END): 67290
    if (RANGE_BEGIN <= j) if (j <= RANGE_END): 65299
    Как видно, предложенный способ с разбиением на два if быстрее как с JIT, так и без.
    Правда, такое разбиение ветвлений на два может не подойти для случаев, когда в одном исходном if есть ветвь else, но выполняться такой код будет немного быстрее.
    И, как я говорил ранее, в разных ситуациях код может быть разным. В данном тесте вероятность вхождения числа в диапазон 50%, но в реальных ситуациях эта вероятность может зависеть от всего, даже от расположения звёзд, поэтому сей тест нельзя считать однозначным ответом на вопрос о методах проверки на вхождение на диапазон, равно как и другие аналогичные тесты.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. 4 пользователя(ей) сказали cпасибо:
    $continue$ (27.02.2016) L0ndl3m (18.01.2016) VVWVV (18.01.2016) ziggi (18.01.2016)
 

 

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

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

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

Ваши права

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