【发布时间】:2019-11-09 11:32:51
【问题描述】:
我正在用 C 语言为嵌入式系统上的文本文件编写解析器。我需要每秒使用 sscanf 函数数百次,这会造成性能问题。因此,我正在尝试寻找 sscanf 的快速替代方案。
我需要解析的文本文件包含格式为“parameter=%d,%d,%d,%d”的参数。参数名称长度不同,但参数始终由 4 个整数值组成。
解析器逐行读取文本文件的一行并将字符串存储在变量“token”中。变量“format”包含格式为“parameter=%d,%d,%d,%d”的字符串。
void Parser_GetQuadToken( char* token, const char* format, int16_t* res1, int16_t* res2, int16_t* res3, int16_t* res4 )
{
uint32_t var1, var2, var3, var4;
sscanf( token, format, &var1, &var2, &var3, &var4 ) );
*res1 = var1;
*res2 = var2;
*res3 = var3;
*res4 = var4;
}
有人知道如何实施快速替代方案吗?
【问题讨论】:
-
更改
format并直接分配给参数?if (sscanf(token, format, res1, res2, res3, res4) != 4) /* error */; -
你有没有分析过这个例程是瓶颈而不是 I/O?
-
你也可以传递更短的字符串:传递
token+10(跳过“参数=”)和“%d,%d,%d,%d”的格式——这样可以加快速度有点。 -
使用
strchr找到=,然后反复调用strtol转换数字可能会更好。strtol给你一个指向你没有转换的第一个数字字符的指针,你可以检查它是否是,,如果是,循环并再次转换。 -
或者如果函数调用开销是个问题,你可以用我的手来做这件事,在字符串中移动一个
char *指针,寻找=和数字和,并滚动你自己内联atoi.