注意:这是对 this question 的跟进.
我有一个“遗留”程序,它对大块 HTML 进行数百个字符串匹配。例如,如果 HTML 匹配 20 多个字符串中的 1 个,则执行某些操作。如果它匹配其他 4 个字符串中的 1 个,则执行其他操作。这些字符串有 50-100 组来匹配这些 HTML block (通常是整个页面)。
我正在努力重构这些困惑的代码,并尝试想出一个好的方法来进行所有这些匹配。
这段代码的性能要求比较严格。进行这些匹配时不需要等待 I/O,因此它们需要在内存中。此外,此进程可能有 100 多个拷贝同时运行,因此启动时的大 I/O 可能会导致其他拷贝的 I/O 变慢。
考虑到这些要求,如果只将这些字符串的一个拷贝存储在 RAM 中将是最有效的(请参阅上面链接的我之前的问题)。
这个程序目前运行在带有微软编译器的 Windows 上,但我希望尽可能保持解决方案的跨平台性,所以我不认为我想使用 PE 资源文件或其他东西。
Mmapping 一个外部文件可能有效,但我遇到了保持程序版本和数据版本同步的问题,一个没有另一个通常不会改变。此外,这需要一些文件“格式”,这会增加一层我不想拥有的复杂性。
所以在所有这些序言之后,最好的解决方案似乎是拥有一堆字符串数组,然后我可以对其进行迭代。这看起来有点困惑,因为我大量混合了代码和数据,但是根据上述要求,有没有更好的方法来处理这种情况?
最佳答案
我不确定当前的实现有多慢。因此,如果不知道需要什么级别的优化,就很难推荐优化。
不过,鉴于此,我可能会建议采用两阶段方法。把你的字符串列表编译成一个 radix tree ,然后将此树保存为某种自定义格式(XML 可能足以满足您的目的)。
那么您的进程启动应该包括读取基数树和匹配。如果你想要/需要优化树的内存存储,那可以作为一个单独的项目来完成,但在我看来改进匹配算法会更有效地利用时间。在某些方面,这是一个“滚动你自己的正则表达式系统”的想法。与使用解析器生成器的建议非常相似。
编辑:我使用了与此类似的东西,作为预编译步骤,自定义脚本生成了一个稍微优化的结构并将其保存到一个大的 char* 数组中。 (显然不能太大,但这是另一种选择)
想法是将列表保留在那里(使维护相当容易),但预编译步骤可加快运行时的访问速度。
关于c++ - C++中分类字符串文字的高效内存存储和检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3738940/