C 优化文本文件解析器以提高速度

C 优化文本文件解析器以提高速度,c,file,parsing,text,C,File,Parsing,Text,我正在编写一个函数,用于解析C中的文本文件。该文本文件包含以下形式的数千个参数: parameter=1,6,3,6 another_parameter=1,45,2,3 为了逐行解析文本文件,我使用问题的答案 使用下面的代码,已经可以快速解析文本文件。然而,我希望进一步提高它的速度。有人有什么可以进一步优化的建议吗 void ConfigReader_ScanInt16x4 (const char *token, const char *format, int16_t *res1, int

我正在编写一个函数,用于解析C中的文本文件。该文本文件包含以下形式的数千个参数:

parameter=1,6,3,6
another_parameter=1,45,2,3
为了逐行解析文本文件,我使用问题的答案

使用下面的代码,已经可以快速解析文本文件。然而,我希望进一步提高它的速度。有人有什么可以进一步优化的建议吗

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;
    }
}
  • 使用lexer生成器(如Flex)和简单的解析器。[您可以为解析器使用解析器生成器,但为您的参数语言执行手工代码解析器应该不是很难。)lexer生成器将在一个高效的状态机中组合所有strtok函数,该状态机只检查每个输入字符一次

  • 使用一个大的缓冲区来读取源文件,以最小化磁盘读取的成本。(操作系统调用是昂贵的)


  • 你知道,这是你应用程序的瓶颈吗?@JCWasmx86:是的,我已经测试过了。你有什么样的基准测试,这样我们就可以用相同的输入来比较性能了吗?@JCWasmx86:我正在嵌入式系统上运行代码。每行调用ConfigReader_ScanInt16x4大约100次需要150µs。此外也就是说,读取该行需要100µs。尝试用
    resstr=&token[i];
    替换
    resstr=strchr(token,'=');
    ConfigReader_ScanInt16x4(token, "parameter=%d,%d,%d,%d", (int16_t*) &parameter[0], (int16_t*) &parameter[1], (int16_t*) &parameter[2], (int16_t*) &parameter[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]);