快速检查子字符串的方法
Fast method to check for substrings
我目前正在编写一个基于服务器-客户端模型的聊天系统,使用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很受欢迎。它需要对目标字符串进行预处理,这对于您的用例应该是可行的。
精确字符串匹配算法是一个免费的电子书,深入描述了不同的搜索算法和它们的权衡。
实现更高级的算法可能需要相当大的努力。正如在其他回答中所说,字符串搜索是否是聊天服务器中的瓶颈是值得怀疑的。
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 具有字符串化的可变参数宏的现代/通用方法
- 接收字符串并使用它来调用方法C++
- 如何分隔字符串并将标记传递给方法
- 是否有通用方法可以找到任何以 null 结尾的字符串的长度?
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 在 C++11 中字符串化变量名称的替代方法
- 连接和压缩标准::vector<std::字符串的最佳方法>
- Esp8266 & Nodemcu:返回请求字符串的方法
- 将位字符串转储到二进制文件的最佳方法是什么
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 创建字符串数组的有效方法
- 如何使用字符串::replace方法写入文件
- 是否有更有效的方法来生成日期的REGEX字符串
- C++-将对象(如字符串)映射到表中成员函数的正确方法
- 有没有更快的方法从成员函数返回格式化字符串
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 从c++中的类指针对象调用方法(字符串)