在Unicode文本/字符串中是否有快速高效的文本搜索?我需要搜索单词的一部分,而不仅仅是整个单词。
SearchBuf?
谢谢!
Pos
和相关函数。然而,这些是在Delphi转换为Unicode之前编写的,我不知道是否有类似的优化Unicode实现。如果我今天要编写一个并希望将其优化为现代处理器(能够使用SSE4.2指令集)的算法,我会认真研究PCMPESTRI
汇编指令(参考pdf文件;也可以参见这里,但我不知道那段代码是否有效),它可以处理Unicode字符串搜索所需的2字节字符。SearchBuf
比Pos/PosEx
慢。但它确实有其他选项,比如整个单词搜索和大小写不敏感搜索。Pos
的UnicodeString版本比PosEx
慢(至少在Delphi 2010中,Pos
使用最慢的rep scansw
汇编语言,而PosEx
则使用了两个宽字符展开比较)。因为我猜想您想要一个搜索的起始偏移量(创建子字符串以调用Pos
非常慢),所以您可能想使用PosEx
。
Bower-More算法可能会更快一些,您需要在应用程序上进行尝试,并针对真实数据进行猜测,看看是否值得。
- 先做对再做快。在做快之前,要做清晰。做快时,保持正确。—— Kernighan和Plauger,《程序设计风格的元素》
- 过早优化是万恶之源。—— Donald Knuth,引用C. A. R. Hoare
- 性能的关键在于优雅,而不是一堆特殊情况。必须抵制调整的诱惑。—— Jon Bentley和Doug McIlroy
- 规则可以概括为:“1.不要过早优化。2.在确实需要之前不要优化。3.即使如此,在了解需要什么以及何处之前也不要优化。”——Herb Sutter
PosEx()
版本更快(即使是在 Delphi 2010 中使用的版本):它使用 DWORD 对齐搜索,而在 Delphi 2010 中实现的 UnicodeString 版本仍然使用 WideChar
读取。这就是为什么我写了关于可能使用 AnsiString 的原因。内存/磁盘使用将更低(小两倍),因此更快。对于非英文文本(甚至是中文等更糟糕的情况),AnsiString 将比使用 UnicodeString 更慢,因为 MBCS 是有成本的。 - Arnaud Bouchez
System.Pos
和StrUtils.PosEx
函数了吗? - RRUZ