许多 FastCode 函数可能会在 Delphi 2009 中编译并看起来工作得很好,但它们并不适合所有输入。在汇编器中实现的那些将失败,因为它们假设字符每个只有一个字节。在 Delphi 中实现的效果会好一些,但有时它们仍然会返回不正确的结果,因为旧CompareText
的“不区分大小写”的概念是基于 ASCII 而新的概念应该基于 Unicode。除了大小写之外,哪些字符被视为相同的规则对于Unicode 与它们对于 ASCII的规则有很大不同。
Andreas 在下面的评论中说 UnicodeCompareText
仍然使用 ASCII 大小写比较规则,因此一些 FastCode 函数应该可以正常工作。在使用它们之前检查它们以确保它们没有做出任何字符大小的假设。我似乎记得一些FastCode 函数已经被合并到 Delphi RTL 中。我不知道是否CompareText
是其中之一。
如果您CompareText
在哈希表中调用了很多,那么这表明您的哈希表做得不是很好。CompareText
仅当您要搜索的事物的哈希在哈希表中指定为非空存储桶时才应被调用。从那里开始,哈希表通常会使用线性搜索在桶中找到正确的项目,并且CompareText
在搜索过程中它会调用每个项目。不知道你用的那个是不是这样。
您可以通过使用不同的散列函数来解决这个问题,该函数将其结果更均匀地分布在可用的存储桶上。如果您的桶已经被均匀填充,那么您可能需要更多桶(然后确保哈希函数仍然均匀分布在该数字上)。
如果您使用的 hash-map 类是基于 的TBucketList
,那么桶存储还有改进的空间。该类不会计算整个输入的哈希值。它仅使用输入来确定要使用的存储桶。如果该类还跟踪为字符串计算的完整哈希,那么线性搜索期间的比较可能会更快。只需比较哈希,并且仅在哈希完全匹配时才比较字符串。(对于 256 桶桶列表,支持的最大大小,只有一个字节的输入决定桶,其余字节被忽略。)我之前写过TBucketList
这里。