jenya7 0 22 апреля, 2021 Опубликовано 22 апреля, 2021 · Жалоба 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 и.т.д Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 26 апреля, 2021 Опубликовано 26 апреля, 2021 · Жалоба Сделал еще проще: при старте программы замещаю все текстовые ключи в строках на однобайтовый код ключа, далее во время выполнения делаю парсинг через 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться