3

例如,我有一个用户 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,
...

假设这个列表不是一个文件,而是一个内存中的字符串列表。

现在假设我想了解某个程序被某些程序访问的频率,如它们的版本号所示。(例如“Some Program version 1.20”被访问了 193 次,“Some Program version 0.98”被访问了 876 次,“Some Program 1.0.1”被访问了 1,932 次)

是构建一个正则表达式然后用它regexec()来查找匹配并拉出版本号,还是strstr()匹配程序名称加逗号,然后读取字符串的以下部分作为版本号更好?如果它有所作为,假设我在 Linux 上使用 GCC。

有性能差异吗?一种方法比另一种方法“更好”还是“更合适”?这有关系吗?

4

4 回答 4

3

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

于 2012-07-22T23:00:37.997 回答
1

strchr/memcmp 是大多数 libc 版本实现 strstr 的方式。glibc 中 strstr 的硬件相关实现做得更好。SSE2 和 SSE4.2 (x86) 指令集都比逐字节扫描要好得多。如果您想了解如何操作,我不久前发布了几篇博客文章 --- SSE2 和 strstr 以及SSE2 和 BNDM 搜索--- 您可能会觉得有趣。

于 2012-07-30T21:21:54.073 回答
0

strtok(),并将数据分解成更结构化的东西(如结构列表)。

于 2012-07-22T23:02:46.430 回答
0

我什么都不做:我打赌用它strchr()来查找逗号和strcmp()检查程序名称会更快。

至于性能,我希望字符串函数(strtok/ strstr/ strchr/ strpos/ strcmp...)或多或少以相同的速度运行(即非常非常快),而正则表达式的运行速度会明显变慢,尽管仍然很快。

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

例如,您获得所有程序的所有频率数据的单次扫描将比寻找给定程序的单次扫描慢得多。但是如果设计得当,对其他程序的所有后续查询都会运行得更快。

于 2012-07-22T23:04:10.150 回答