【问题标题】:Optimizing a text file parser for speed优化文本文件解析器以提高速度
【发布时间】: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*) &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]);

【问题讨论】:

  • 你知道吗,这是你的应用程序的瓶颈?
  • @JCWasmx86:是的,我测试过了。
  • 您对我们有什么基准,所以我们可以谈论相同的输入来比较性能吗?
  • @JCWasmx86:我在嵌入式系统上运行代码。每行调用 ConfigReader_ScanInt16x4 大约 100 次需要 150 µs。除此之外,读取该行需要 100 µs。
  • 试试用resstr = &amp;token[i];替换resstr = strchr( token, '=' );吧?

标签: c file parsing text


【解决方案1】:
  1. 使用 Flex 等词法分析器生成器和简单的解析器。 [你可以为解析器使用解析器生成器,但是为你的参数语言做一个手动代码解析器应该不是很难)。词法分析器生成器会将您的所有 strtotok 函数组合到一个高效的状态机中,该状态机只检查每个输入字符一次。

  2. 使用大缓冲区来读取源文件,以尽量减少磁盘读取的成本。 (操作系统调用很昂贵)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2015-10-28
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多