比方说,我有一个用户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。
是否存在性能差异?一种方法比另一种方法“更好”还是“更合适”?它有意义吗?
答案 0 :(得分:3)
使用strstr()
- 使用正则表达式来计算出现次数不是一个好主意,因为你还是需要使用循环,所以我建议你做一个简单的循环来搜索子串的poistion并在每场比赛后增加计数器并开始搜索位置。
答案 1 :(得分:1)
strchr / memcmp是大多数libc版本实现strstr的方式。 glibc中strstr的硬件相关实现做得更好。 SSE2和SSE4.2(x86)指令集都可以比逐字节扫描更好。如果你想看看如何,我不久前发布了一些博客文章--- SSE2 and strstr和SSE2 and BNDM search ---你可能会感兴趣。
答案 2 :(得分:0)
strtok(),并将数据分解为更结构化的内容(如结构列表)。
答案 3 :(得分:0)
我不会这样做:我认为使用strchr()
查找逗号会更快,strcmp()
来检查程序名称。
至于性能,我希望字符串函数(strtok
/ strstr
/ strchr
/ strpos
/ strcmp
...)可以运行更多或较少以相同的速度(即真的,非常快),并且正则表达式运行速度明显较慢,但仍然非常快。
真正的性能优势来自于正确设计搜索:它必须运行多少次,是否修复了程序的数量......?
例如,单次扫描可以获得所有程序的所有频率数据,这比单次扫描寻找给定程序要慢得多。但设计得当,其他程序的所有后续查询都会更快。