strstr vs regex in c

时间:2012-07-22 22:30:58

标签: c regex gcc strstr

比方说,我有一个用户ID,访问时间,程序名称和版本号列表作为CSV字符串列表,如下所示:

1,1342995305,Some Program,0.98
1,1342995315,Some Program,1.20
2,1342985305,Another Program,15.8.3
1,1342995443,Bob's favorite game,0.98
3,1238543846,Something else,
...

假设此列表一个文件,但是是内存中的字符串列表。

现在让我们说我想知道程序访问某些程序的频率,按其版本号列出。 (例如“某些程序版本1.20”被访问了193次,“某些程序版本0.98”被访问了876次,并且“某些程序1.0.1”< / em>被访问过1,932次)

构建正则表达式,然后使用regexec()查找匹配项并提取版本号,或strstr()以匹配程序名称加上逗号,然后只需阅读以下部分字符串作为版本号?如果它有所作为,假设我在Linux上使用GCC。

是否存在性能差异?一种方法比另一种方法“更好”还是“更合适”?它有意义吗?

4 个答案:

答案 0 :(得分:3)

使用strstr() - 使用正则表达式来计算出现次数不是一个好主意,因为你还是需要使用循环,所以我建议你做一个简单的循环来搜索子串的poistion并在每场比赛后增加计数器并开始搜索位置。

答案 1 :(得分:1)

strchr / memcmp是大多数libc版本实现strstr的方式。 glibc中strstr的硬件相关实现做得更好。 SSE2和SSE4.2(x86)指令集都可以比逐字节扫描更好。如果你想看看如何,我不久前发布了一些博客文章--- SSE2 and strstrSSE2 and BNDM search ---你可能会感兴趣。

答案 2 :(得分:0)

strtok(),并将数据分解为更结构化的内容(如结构列表)。

答案 3 :(得分:0)

我不会这样做:我认为使用strchr()查找逗号会更快,strcmp()来检查程序名称。

至于性能,我希望字符串函数(strtok / strstr / strchr / strpos / strcmp ...)可以运行更多或较少以相同的速度(即真的,非常快),并且正则表达式运行速度明显较慢,但仍然非常快。

真正的性能优势来自于正确设计搜索:它必须运行多少次,是否修复了程序的数量......?

例如,单次扫描可以获得所有程序的所有频率数据,这比单次扫描寻找给定程序要慢得多。但设计得当,其他程序的所有后续查询都会更快。