【发布时间】:2021-07-23 23:41:19
【问题描述】:
我正在用 C 编写一个用于解析文本文件的函数。该文本文件包含数千个以下形式的参数:
parameter=1,6,3,6
another_parameter=1,45,2,3
为了逐行解析文本文件,我使用了问题的答案 Fast alternative to sscanf
使用下面的代码,已经可以快速解析文本文件了。但是,我希望进一步改进它以提高速度。有没有人有什么可以进一步优化的建议?
void ConfigReader_ScanInt16x4 (const char *token, const char *format, int16_t *res1, int16_t *res2, int16_t *res3, int16_t *res4)
{
int stop = 0;
char* resstr;
for(int i = 0; i < 100; i++)
{
if (token[i] != format[i])
{
stop = 1;
break;
}
if(token[i] == '=')
{
resstr = strchr( token, '=' );
break;
}
}
if(stop == 0)
{
*res1 = (int16_t)strtol( ++resstr, &resstr, 10 );
*res2 = (int16_t)strtol( ++resstr, &resstr, 10 );
*res3 = (int16_t)strtol( ++resstr, &resstr, 10 );
*res4 = (int16_t)strtol( ++resstr, &resstr, 10 );
stop2 = 1;
}
}
为了解析文本文件,我逐行遍历它并调用函数来解析令牌中包含的当前行:
ConfigReader_ScanInt16x4(token, "parameter=%d,%d,%d,%d", (int16_t*) ¶meter[0], (int16_t*) ¶meter[1], (int16_t*) ¶meter[2], (int16_t*) ¶meter[3]);
ConfigReader_ScanInt16x4(token, "another_parameter=%d,%d,%d,%d", (int16_t*) &another_parameter[0], (int16_t*) &another_parameter[1], (int16_t*) &another_parameter[2], (int16_t*) &another_parameter[3]);
【问题讨论】:
-
你知道吗,这是你的应用程序的瓶颈?
-
@JCWasmx86:是的,我测试过了。
-
您对我们有什么基准,所以我们可以谈论相同的输入来比较性能吗?
-
@JCWasmx86:我在嵌入式系统上运行代码。每行调用 ConfigReader_ScanInt16x4 大约 100 次需要 150 µs。除此之外,读取该行需要 100 µs。
-
试试用
resstr = &token[i];替换resstr = strchr( token, '=' );吧?