快速检查子字符串的方法

Fast method to check for substrings

本文关键字:方法 字符串 检查      更新时间:2023-10-16

我目前正在编写一个基于服务器-客户端模型的聊天系统,使用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机器。

您是否进行了基准测试,以验证实际上在检查被阻塞的单词上花费了大量时间?我完全天真的猜测是,你将花费更多的时间等待rpc而不是任何本地处理…

您是否尝试过c++ 11中的正则表达式库,如果您使用它,或者如果您不使用Boost ?我不确定速度,但我相信他们表现得很好。此外,如果您将其用作亵渎过滤器的一种形式,则无论如何都需要正则表达式来防止琐碎的规避。

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

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

精确字符串匹配算法是一个免费的电子书,深入描述了不同的搜索算法和它们的权衡。

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