检查子串的快速方法

时间:2011-10-25 23:08:19

标签: c++ visual-c++

我目前正在编写基于服务器 - 客户端模型的聊天系统,并使用TCP作为通信协议。虽然它按预期工作,但我想进一步优化服务器端的重要部分。

服务器使用四个额外的线程来处理新的连接,控制台输入等,而不会阻止正常的聊天对话。好吧,从客户端到客户端的所有消息只有一个线程,所以我认为优化那里的代码会很好,因为这将是最明显的瓶颈。在读取每个客户端套接字上的数据后,必须使用不同的步骤处理数据。其中一个步骤是检查被阻止的单词。这就是我原来的问题开始的地方。


我使用了std::string::find()strstr()功能。根据我的测试,std::string::find()显然比旧的C风格的strstr()函数更快。

我知道std::string已经得到了很好的优化,但是C风格的char数组和它们自己的函数似乎总是更快,特别是如果字符串必须反复构建

那么,是否有比std::string::find()更快的速度来扫描一系列字符以查找被阻止的字词? std::string::find()strstr()快,还是我的基准糟糕?我知道,与保持C风格的char数组及其功能所需的努力相比,增益可能相反,但我希望尽可能快地保持它,即使它仅用于测试目的。


编辑:抱歉,忘记提及我使用的是MSVC ++ 2010 Express。我只针对Windows机器。

3 个答案:

答案 0 :(得分:4)

您是否进行过基准测试以确认在检查被阻止的字词时实际上是否有大量时间?我完全天真的猜测是你要花费更多的时间等待RPC而不是任何本地处理...

答案 1 :(得分:2)

如果您使用C ++ 11,您是否尝试过正则表达式库,如果不使用,则尝试使用Boost?我不确定速度,但我相信它们表现得很好。此外,如果您使用此作为亵渎过滤器的一种形式,您仍然需要正则表达式来防止琐碎的规避。

答案 2 :(得分:1)

存在比STL或strstr中通常使用的线性搜索更快的搜索算法。

Boyer-Moore非常受欢迎。它需要预处理目标字符串,这对于您的用例应该是可行的。

Exact string matching algorithms是一本免费的电子书,深入介绍了不同的搜索算法及其交易。

实施更高级的算法可能需要相当大的努力。 正如其他答案中所说,字符串搜索在聊天服务器中是一个瓶颈是值得怀疑的。