C中查找数组的性能

use*_*718 0 c arrays lookup performance

我必须迭代一个包含大约100M行的日志文件.我必须为多个日志执行此操作.平均线长为110个字符.

目前我正在循环查看可能的匹配列表.我想知道是否有更好的方法吗?

char *in_array(char *car) {
    // longer list than this...
    char *carlist[] =
    { 
        "Avalon",
        "Azera",
        "Cayenne",
        "Civic",
        "Corolla",
        "Elantra",
        "F-150",
        "Hilux",
        "Lexus LS",
        "Rav 4",
        "Sienna",
        // etc...
    };  

    char *match;
    int i;
    int n = sizeof(carlist)/sizeof(carlist[0]);

    for(i = 0; i < n; i++)
    {
        match = strstr(car, carlist[i]);
        if(match != NULL)
        {
            return strdup(match);
        } 
    }   

    return strdup("No match");
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 5

DFA(确定性有限自动机,多个自动机)可以比单独依次测试每个模式更快地匹配字符串与多个模式.

分析器生成器擅长自动构建DFA表.

缺点是当模式列表发生变化时必须重建DFA ...但由于您的模式列表当前是硬编码为数组,因此对您来说不应该有问题.

由于您使用的是C,flex因此是一个很好的工具.