搜索大型char数组时降低cpu使用率

时间:2011-08-29 22:34:42

标签: c arrays optimization

我在char数组中搜索几个字节。问题是在较慢的机器上,进程可以达到90%以上的CPU使用率。怎么预防?我的代码是:

            for(long i = 0; i < size - 5; ) {
                if (buff[++i] == 'f' && buff[++i] == 'i' && buff[++i] == 'l' && buff[++i] == 'e') {
                     printf("found at: %d\n", i);
                }
            }

编辑: 字符串“file”以null结尾。

3 个答案:

答案 0 :(得分:4)

这看起来像尝试非常天真的字符串搜索,我建议您使用为此目的提供的标准函数(如strstr)和/或研究字符串搜索算法,如Boyer-Moore

关于Boyer-Moore的链接维基百科文章很好地展示了为什么不一致地移动一个角色(就像你一样) - 这是一个有趣的阅读。

编辑:同时看看this page,它有一个很好的动画演示,展示了BM如何发挥作用。

EDIT2:关于字符串未被终止:要么

buff[size] = 0;

自己终止它,并使用strstr,或者你看看我链接的页面中的BM代码,它与长度有关,即它可以使用字符串而不会终止0。

答案 1 :(得分:3)

获得90%的利用率没有任何问题,因为该算法受CPU约束。但...

除非您希望搜索项位于32位字边界,否则代码将被破坏。如果单词'file'从缓冲区的第二个字符开始,你只需跳过它。(编辑:短路eval意味着代码是正确的。我的错误。)

不要为此滚动自己的代码;使用strstr

答案 2 :(得分:0)

尝试只存储找到'file'的值列表,然后在循环后打印出来。它将阻止上下文切换,并使CPU能够更好地使用缓存。还把我放在一个登记簿中。