我在我的程序中广泛使用哈希映射数据结构。我正在使用Barry Kelly在Codegear论坛上发布的哈希映射实现。该实现在内部使用RTL的CompareText函数。分析让我意识到在SysUtils CompareText函数中花了很多时间。

我看了一下

Fastcode网站

并发现了CompareText的一些更快的实现。不幸的是,他们似乎不适用于D2009及其unicode字符串。

现在提出问题:是否有类似的更快版本支持D2009字符串?在使用哈希映射时(至少在我目前正在使用的实现中),似乎会对CompareText函数进行大量调用,因此很少有性能改进可能会产生重大影响。或者那里提供的实现是否也适用于unicode字符串?

有帮助吗?

解决方案

许多FastCode函数可能在Delphi 2009中编译并且似乎工作正常,但它们不适合所有输入。汇编程序中实现的那些将失败,因为它们假设字符每个只有一个字节。在Delphi中实现的那些将会好一点,但它们仍然会返回不正确的结果,因为旧的 CompareText 的概念是“不区分大小写”。基于ASCII,而新的应该基于Unicode。对于Unicode而言,对于哪些字符被认为是相同的规则,对于Unicode来说, 是不同的。

Andreas在下面的评论中说,Unicode CompareText 仍然使用ASCII大小写比较规则,因此许多FastCode函数应该可以正常工作。在使用它们之前先看一下它们,以确保它们没有做出任何字符大小的假设。我似乎记得一些 FastCode函数已经整合到Delphi RTL中。我不知道 CompareText 是否是其中之一。

如果你在哈希表中大量调用 CompareText ,那么这表明你的哈希表没有做得很好。 CompareText 只应在您搜索的东西的哈希值被调用时才在哈希表中指定非空桶。从那里,哈希表通常使用线性搜索来查找存储桶中的正确项目,并且在搜索期间将为每个项目调用 CompareText 。我不知道你使用的那个是否有效。

您可以通过使用不同的哈希函数来解决此问题,该函数将结果更均匀地分布在可用存储桶上。如果您的存储桶已经均匀填充,那么您可能需要更多存储桶(然后确保哈希函数仍然均匀分布在 数字上)。

如果您使用的哈希映射类基于 TBucketList ,那么存储桶存储还有改进的余地。该类不计算整个输入的哈希值。它使用输入 only 来确定要使用的存储桶。如果类也会跟踪为字符串计算的完整哈希值,那么线性搜索期间的比较可能会更快。只需比较哈希值,并仅在哈希值完全匹配时比较字符串。 (对于256桶存储列表,支持的最大大小,输入中只有一个字节确定存储区,其余字节将被忽略。)我之前在这里写过 TBucketList

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top