我在我的程序中广泛使用哈希映射数据结构。我正在使用Barry Kelly在Codegear论坛上发布的哈希映射实现。该实现在内部使用RTL的CompareText函数。分析让我意识到在SysUtils CompareText函数中花了很多时间。
我看了一下
并发现了CompareText的一些更快的实现。不幸的是,他们似乎不适用于D2009及其unicode字符串。
现在提出问题:是否有类似的更快版本支持D2009字符串?在使用哈希映射时(至少在我目前正在使用的实现中),似乎会对CompareText函数进行大量调用,因此很少有性能改进可能会产生重大影响。或者那里提供的实现是否也适用于unicode字符串?
答案 0 :(得分:4)
许多FastCode函数可能在Delphi 2009中编译并且似乎工作正常,但它们不适合所有输入。汇编程序中实现的那些将失败,因为它们假设字符每个只有一个字节。在Delphi中实现的那些会好一点,但是它们仍会返回不正确的结果,因为旧的CompareText
的“不区分大小写”的概念基于ASCII,而新的概念应该基于Unicode 。对于Unicode而言,对于哪些字符被认为是相同的规则,对于Unicode来说, 是不同的。
Andreas在下面的评论中说,Unicode CompareText
仍然使用ASCII案例比较规则,因此许多FastCode函数应该可以正常工作。在使用它们之前先看一下它们,以确保它们没有做出任何字符大小的假设。我似乎记得一些 FastCode函数已经整合到Delphi RTL中。我不知道CompareText
是否是其中之一。
如果你在哈希表中大量调用CompareText
,那么这表明你的哈希表没有做得很好。只有当你要搜索的东西的哈希在哈希表中指定一个非空桶时,才会调用CompareText
。从那里开始,哈希表通常会使用线性搜索来查找存储桶中的正确项目,并且在搜索期间将为每个项目调用CompareText
。我不知道你使用的那个是否有效。
您可以通过使用不同的哈希函数来解决此问题,该函数将结果更均匀地分布在可用存储桶上。如果您的存储桶已经均匀填充,那么您可能需要更多存储桶(然后确保哈希函数仍然均匀分布在 数字上)。
如果您使用的哈希映射类基于TBucketList
,那么存储桶存储还有改进的余地。该类不计算整个输入的哈希值。它使用输入 only 来确定要使用的存储桶。如果类也会跟踪为字符串计算的完整哈希值,那么线性搜索期间的比较可能会更快。只需比较哈希值,并仅在哈希值完全匹配时比较字符串。 (对于256桶存储列表,支持的最大大小,输入中只有一个字节确定存储区,其余字节将被忽略。)I've written about TBucketList
here before.