注:这是后续这个问题 https://stackoverflow.com/questions/3738092/c-string-literal-storage-between-multiple-copies-of-process-or-library.
我有一个“遗留”程序,它可以对大块 HTML 进行数百个字符串匹配。例如,如果 HTML 匹配 20 多个字符串中的 1 个,则执行某些操作。如果它与其他 4 个字符串中的 1 个匹配,则执行其他操作。有 50-100 组这些字符串与这些 HTML 块(通常是整个页面)进行匹配。
我正在努力重构这些混乱的代码,并试图想出一个好的方法来完成所有这些匹配。
这段代码的性能要求相当严格。在进行这些匹配时,它不需要等待 I/O,因此它们需要位于内存中。此外,该进程可能有 100 多个副本同时运行,因此启动时的大量 I/O 可能会导致其他副本的 I/O 缓慢。
考虑到这些要求,如果这些字符串的一个副本仅存储在 RAM 中,那么效率将是最高的(请参阅上面链接的我的上一个问题)。
该程序目前在带有 Microsoft 编译器的 Windows 上运行,但我希望解决方案尽可能跨平台,因此我认为我不想使用 PE 资源文件或其他东西。
映射外部文件可能会起作用,但我会遇到保持程序版本和数据版本同步的问题,一个版本通常不会在没有另一个版本的情况下发生更改。此外,这还需要一些文件“格式”,这增加了我不想拥有的复杂性。
因此,在完成所有这些前言之后,似乎最好的解决方案是拥有一堆字符串数组,然后我可以对其进行迭代。这看起来有点混乱,因为我大量混合了代码和数据,但是根据上述要求,有没有更好的方法来处理这种情况?
我不确定当前的实施有多慢。因此,在不知道需要什么级别的优化的情况下,很难推荐优化。
然而,鉴于此,我可能建议采用两阶段方法。获取你的字符串列表并将其编译成基数树 http://en.wikipedia.org/wiki/Radix_tree,然后将此树保存为某种自定义格式(XML 可能足以满足您的目的)。
然后你的进程启动应该包括读取基数树和匹配。如果您想要/需要优化树的内存存储,可以作为一个单独的项目来完成,但在我看来,改进匹配算法将更有效地利用时间。在某些方面,这是一个“推出你自己的正则表达式系统”的想法。与使用解析器生成器的建议非常相似。
编辑:我使用了与此类似的东西,作为预编译步骤,自定义脚本生成某种程度优化的结构并将其保存到大型 char* 数组中。 (显然它不能太大,但这是另一种选择)
这个想法是将列表保留在那里(使维护相当容易),但预编译步骤可以加快运行时的访问速度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)