Перейти к содержанию
    

sprintf() с динамически созданным списком печатаемых значений

sprintf довольно монструозная функция. думаю она и сжирает основное время.

когда то делал так

Spoiler

void MyPrintf(int argc, ...)
{
    int i;
    int ival;
    float fval;
    char *strp;
    VAR var;
    
    va_list valist; 
    
    va_start(valist, argc); 
    
    //first argument is a resulting string
    char *string = va_arg(valist, char *);
   
    for (i = 1; i < argc; i++)
    {
        var = va_arg(valist, VAR);
  
        switch (var.type)
        {
            case VTYPE_BYTE:  
               ival = var.bvalue;
               strp = loc_itoa(ival);
            break;  
            
            case VTYPE_INT:
              ival = var.ivalue;
              strp = loc_itoa(ival);
             break;
             
            case VTYPE_FLOAT:
                fval = var.fvalue;
                strp = loc_ftoa(fval, 2);
            break;
            
            case VTYPE_STR:
              strp = var.pcvalue;
            break;
        }
        
        strcat(string, strp); 
    }
    
   strcat(string, "\0");
   
   va_end(valist); 
}

 

в вашем случае надо добавить case DATE, case TIME и.т.д

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал еще проще: при старте программы замещаю все текстовые ключи в строках на однобайтовый код ключа, далее во время выполнения делаю парсинг через switch-case. получилось может и монстроидально в исходнике (сотня кейсов), но зато полностью читабельно.

Результат- время выполнения сократилось до примерно 1 ms на парсинг строки, что в 18 раз быстрее чем было. Понимаю, что есть куда расти (например, перейти к упомянутым выше itoa/ftoa), но меня и этот получившийся результат абсолютно устраивает :)

Кстати, как я и надеялся, этот длинный switch-case компилятор заменил на вычисляемый переход. На сайте кейла про это указано- нужно только соблюсти некоторые условия для такого результата.

В case-switch в листинге ниже используются коды 1-101, но не все.

;;;798    		    switch (keyCode)
000d98  2865              CMP      r0,#0x65
000d9a  d25e              BCS      |L1.3674|
000d9c  e8dff000          TBB      [pc,r0]
000da0  fc33424e          DCB      0xfc,0x33,0x42,0x4e
000da4  fdfaf9f8          DCB      0xfd,0xfa,0xf9,0xf8
000da8  f7f65df5          DCB      0xf7,0xf6,0x5d,0xf5
000dac  f4f3f2f1          DCB      0xf4,0xf3,0xf2,0xf1
000db0  f0efeeed          DCB      0xf0,0xef,0xee,0xed
000db4  ecebeae9          DCB      0xec,0xeb,0xea,0xe9
000db8  e8e7e6e5          DCB      0xe8,0xe7,0xe6,0xe5
000dbc  e4e3e2e1          DCB      0xe4,0xe3,0xe2,0xe1
000dc0  e0dfdedd          DCB      0xe0,0xdf,0xde,0xdd
000dc4  dcdbdad9          DCB      0xdc,0xdb,0xda,0xd9
000dc8  d8d7d6d5          DCB      0xd8,0xd7,0xd6,0xd5
000dcc  d4d3d2d1          DCB      0xd4,0xd3,0xd2,0xd1
000dd0  d0cfcecd          DCB      0xd0,0xcf,0xce,0xcd
000dd4  cccbcac9          DCB      0xcc,0xcb,0xca,0xc9
000dd8  c8c7c6c5          DCB      0xc8,0xc7,0xc6,0xc5
000ddc  c4c3c2c1          DCB      0xc4,0xc3,0xc2,0xc1
000de0  c0bfbebd          DCB      0xc0,0xbf,0xbe,0xbd
000de4  bcbbbab9          DCB      0xbc,0xbb,0xba,0xb9
000de8  b8b7b6b5          DCB      0xb8,0xb7,0xb6,0xb5
000dec  b4b3b2b1          DCB      0xb4,0xb3,0xb2,0xb1
000df0  5d5d5d5d          DCB      0x5d,0x5d,0x5d,0x5d
000df4  b0afaead          DCB      0xb0,0xaf,0xae,0xad
000df8  acabaaa9          DCB      0xac,0xab,0xaa,0xa9
000dfc  a85d5da7          DCB      0xa8,0x5d,0x5d,0xa7
000e00  a6a5a4a3          DCB      0xa6,0xa5,0xa4,0xa3
000e04  a200              DCB      0xa2,0x00

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...